对于任何软件开发人员而言,为将来计划任务都是必不可少的工具。 尽管我们创建的许多编程旨在响应明确的触发或用户事件,但定期执行的后台进程也同样重要。
“每个星期一早晨更新结果。”
“每天晚上分批下单。”
甚至具有每日请求限制的第三方API也隐式要求这种行为。
“我们只能每五分钟请求一次更新。”
幸运的是,许多聪明的人已经解决了这个问题,并且不难找到python本地解决方案。 Advanced Python Scheduler(APS)是一个很好的选择,它具有简单,直观的API以及同类产品中的一些最佳文档。
对于此项目,我们将专注于将APS提供的调度技术与您的常规Django应用程序集成:洛杉矶天气应用程序,该应用程序定期轮询第三方天气api以进行模型更新。
目标是比Django教程进行更深入的探索,同时不要在任何方向上陷入困境。
I.安装APS和其他依赖项
在您的项目目录中,创建一个虚拟环境并激活它
virtualenv env
. env/bin/activate
根据本指南安装和配置PostgreSQL。 在此阶段,我们只需要在您的计算机上启动并运行SQL管理器即可。
另外,我发现使用PgAdmin PostgreSQL GUI有帮助。 在您的计算机上进行设置的详细信息可以在这里找到(使用Python3)。
使用pip安装所有必需的软件包(注意,psycopg2适用于PostgreSQL):
pip install apscheduler django psycopg2 requests
II. Build your app
Create a new Django project:
django-admin.py startproject advancedScheduler
cd advancedScheduler
python manage.py startapp weather
在这个新目录(根目录)中,您将看到另一个名为advancedScheduler的文件夹。 这是Django项目目录。
为避免两地同名的混淆,我们仅将“根目录”称为“根目录”。 让下面的图作为我们跳文件夹冒险的路线图。
[ super_project_directory/ ]
|
+----[ env/ ] <-- Virtualenv stuff
|
+----[ advancedScheduler/ ] <-- the Root Directory
|
+----[ advancedScheduler/ ] <-- the Django Project Directory
|
+----[ weather/ ] <-- the Django App Directory
尽管主要专注于演示调度程序的功能,但让我们花点时间连接Django应用。
我们首先要将天气应用添加到项目的INSTALLED_APPS中。 该文件位于advancedScheduler / settings.py文件中。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'weather'
]
接下来,将新的网址格式添加到advancedScheduler / urls.py文件中:
path('', include('weather.urls'))
毫不奇怪,我们的下一步将是将该urls.py文件添加到weather app目录中。 将以下代码包含在weather / urls.py中:
from django.conf.urls import url
from weather import views
urlpatterns = [
url(r'^$', views.MainPage.as_view())
]
在天气应用程序目录中创建一个模板文件夹。 将index.html文件添加到此新文件夹。
以下是我们的MTV。
模型
from django.db import models
from datetime import datetime
class Forecast(models.Model):
timestamp = models.DateTimeField()
temperatue = models.DecimalField(max_digits=12,decimal_places=2)
description = models.CharField(max_length=150)
city = models.CharField(max_length=150)
def save(self, *args, **kwargs):
if not self.id:
self.timestamp = datetime.utcnow()
return super(Forecast, self).save(*args, **kwargs)
Template
<div style="text-align: center">
<h5>Currently in</h5>
<h3>{{city}}</h3>
<h4>{{temperature_in_f}} F | {{temperature_in_c}} C</h4>
<h4>{{desctiprion}}</h4>
<p><em>Last updated {{utc_update_time}} GMT</em></p>
</div>
View
import decimal
from datetime import datetime
from django.shortcuts import render
from django.views.generic import TemplateView
from weather.models import Forecast
class MainPage(TemplateView):
def get(self, request, **kwargs):
latest_forecast = Forecast.objects.latest('timestamp')
city = latest_forecast.city
temperature_in_c = latest_forecast.temperatue
temperature_in_f = (latest_forecast.temperatue * decimal.Decimal(1.8)) + 32
description = latest_forecast.description.capitalize
timestamp = "{t.year}/{t.month:02d}/{t.day:02d} - {t.hour:02d}:{t.minute:02d}:{t.second:02d}".format( t=latest_forecast.timestamp)
return render(
request,
'index.html',
{
'city':city,
'temperature_in_c': temperature_in_c,
'temperature_in_f': round(temperature_in_f,2),
'desctiprion': description,
'utc_update_time': timestamp})
Jk N[NyJz[Θ;h~K>z8#УYKhYGfE66VGV"GFKhiNikTE>X8"FhyhKhKyJzZXiZJk N[NyJ8#Уb673&66У&R673''W6#ФTE2ТvF"ТvF"FrvF"W2rvF"76vF"76vW2rvF"F6f2rwvVFW"2FW$6rr ХУFcУ8"XZ:iKK[sУ{.8"Yx+KKY
KN[NyJz[nYiNikz[[ni88#УFR'V'fW"VB6У~[.jFY
k N[NyJyNzKZ>[KyN8"zKZHhKi.yNKX[nznXj8#УXhKN{>i[~iK[N8"yKKKniNikz[ZjXn)jjhKhKK(
n(
nKKnKKh8^Xij>yhX~ikK{NyN{NNXiyNhn^YXxXi{n>yJKjWFFUV67N8#УG66fc#G&K>8"iYNh;>k9S7G&7KXKnKNZJk N[NyJ[{.XxnZH~Z[nyXnK~YjZHNihyNK#УfBF6VGV.iUFXY;yNZ[z^X[~8"ZyNx.yDY.x[xyNKXk.yNZHh
~8">KK8^z[KnK>z8#У^yNyjh[z~ijniKNK"Xz{xX8"xKnYXzXXhKKYNh;>k9^8"KNXn)[ZKn8#У&VcGG3FV"vVFW"#G3FV"vVFW"У^Kh[ZJ~Z{NYFKyJ66VGV"h~.KXyNZkk9^ZZh[ |