简介:今天,首席CTO Note将与您分享与Django合并的方式。如果您可以解决您现在面临的问题,请不要忘记注意此网站。让我们现在开始!
步骤1(型号):设计自己的数据模型。
步骤2(视图):创建一个Web模板。Django自己的HTML模板语言非常容易将数据与模板结合起来以创建动态页面。
第三步(控制):定义URL,提供服务和控制。
Python是一种标准化的编程语言。该结构是相对标准化的,但是很多时候,代码并不像R.因此,使用python中的RPY2软件包(接口)调用R代码是两种美容的方法。直接安装在Python中,以替换Matplotlib绘制图片,从而有效提高工作效率。
许多Django应用程序需要执行异步任务,以免延迟HTTP请求的执行。我们还可以选择许多方法来完成异步任务。使用克莱里是一个更好的选择,因为克莱里
有了大量的社区支持,它可以完美扩展,与Django结合使用也很好。芹菜不仅可以在Django中使用,而且可以在其他地方使用。因此,一旦您学会使用克莱利,我
我们可以在其他项目中非常方便地使用它。
1.克莱里版本
这篇博客文章主要针对芹菜3.0.x。克莱里的早期版本可能有轻微的差异。
2. Cerry介绍
Clery的主要用途是执行异步任务。您可以选择扩展或定期执行功能。为什么需要执行异步任务?
首先,假设用户正在启动请求并等待返回请求。在此请求背后的视图函数中,我们可能需要执行长期的过程任务。目前,我们可能
它可能远大于用户公差的范围。当不需要立即执行此任务时,我们可以使用Clery在后台执行,而不会影响用户浏览Web。
当涉及到,我们通常无法确定它花费的时间。
第二个是定期执行常规任务。例如,您需要每小时检查天气预报,然后将数据存储到数据库中。我们可以编写此任务,然后让芹菜执行
Web应用程序可以获取最新的天气预报信息。
我们在这里谈论的任务是python函数(函数)。定期执行任务可以延迟执行此功能。我们可以使用Clery将功能延迟5分钟5分钟。
任务1并传递参数(1、2、3)。或者我们也可以每天午夜运行该功能。
我们偏向项目中的项目,这对于访问统一数据库和Django设置的任务很方便。
准备好任务后,芹菜会将其放在队列队列中。队列存储任务列表。我们可以使用多个队列,但是为简单起见,我们在这里只使用一个。
将任务任务放在队列中就像加入TODO列表一样。为了使任务运行,我们还需要在其他线程中运行艰苦的工作。工人观察实时行动的任务,然后一一运行。
一些任务。您可以在不同的服务器上使用多个工人。同样,为简单起见,我们只使用一个工人。
我们将在以后讨论队列,工人和另一个非常重要的过程。接下来,让我们这样做:
3.安装克莱里
我们可以使用PIP在vietualenv中安装:
PIP安装django-clery
4. Django设置
我们暂时使用Django Runserver来启动Clery。和芹菜代理,我们使用Django数据库代理实现。现在我们只需要知道克莱里芹菜
需要经纪人,您可以使用Django本身作为经纪人。(但是,当部署时,我们最好使用更稳定和高效的布拉克,例如Redis。)
在steratings.py中:
导入djcelery
djcelery.setup_loader()
broker_url ='django://'
Em
instasted_apps =((
Em
'djcelery',
'kombu.transport.django',
Em
治愈
第一个和第二个项目是必要的,第三个项目告诉芹菜将Django项目用作经纪人。
添加到installed_apps中的djcelery是必要的。kombu.transport.django是基于Django的经纪人
最后创建芹菜所需的数据表。如果您将South用作数据迁移工具,请运行:
python manage.py迁移
否则,运行:( Django 1.6或Django 1.7可以)
python manage.py syncdb
5.创建一个任务
如前所述,任务是Pyhton功能。但是芹菜需要知道此功能是任务,因此我们可以使用装饰器:@task。
在django应用程序目录中创建taske.py:
从芹菜导入任务
@任务 ()
def add(x,y):
返回x + y
当settings.py运行中的djcelery.setup_loader()时,Clery将在APPS Directory中的App Directory中的所有task.py文件中查看Appled_apps中的App Directory中的所有task Files,查找标记为任务的函数,并且预防。
将它们注册为Clery任务。
标记函数作为任务不会阻碍其正常执行。您仍然可以像往常一样称呼它:z = add(1,2)。
6.执行任务
让我们从一个简单的示例开始。例如,我们希望在用户发送请求并立即返回响应后执行任务异步,以免阻止请求,用户可以平稳访问
过程。然后,我们可以在Views.py的视图中使用.delay:
从myapp.tasks导入添加
Em
add.delay(2,2)
Em
克莱里将添加任务以排队并立即返回。在看到工人一侧的任务后,它将根据设置执行并将其从队列中删除。工人将执行以下一代。
代码:
导入myapp.tasks.add
myapp.tasks.add(2,2)
7.关于导入
应该注意的是,当IMPPRT任务时,它需要保持一致。因为执行djcelery.setup_loader()时,任务基于installed_apps中的应用程序名称。
添加.tasks.function_name进行注册。如果由于不同的Python路径而使用不同的参考方法(例如,使用MyProject.myapp.tasks在tasks.py中导入的the。
添加表单),Cerly不会知道这是同一任务,因此可能会导致奇怪的错误。
8.测试
A。开始工人
如前所述,我们需要一个工人来执行任务。以下是如何在开发环境中启动工人的方法:
首先启动终端,例如开发Django项目,激活Virtualenv,切换到Django Project目录。然后启动django构建的Web服务器:Python Manage.py Runserver。
然后开始工人:
python manage.py芹菜工人-loglevel =信息
目前,工人将在终端运行并显示输出结果。
b。开始任务
打开新终端,激活Virtualenv,然后切换到Django项目目录:
$ python manage.py shell
从myapp.tasks导入添加
add.delay(2,2)
目前,您可以看到工人在工作窗口中执行任务:
[2014-10-07 08:47:08,076:info/mainprocess]从经纪人获得任务:myapp.tasks.add [e080e047-b2a2a7-af74-af74-d7d98b02fc]
[2014-10-07 08:47:08,299:info/mainprocess]任务myapp.tasks.add [e080e047-b2a2-43a2-43a7-af74-af74-d7d98b02fc]
9.另一个例子
让我们看一个更真实的示例,即views.py和tasks.py:
#views.py
来自myApp.tasks导入do_something_with_form_data
def视图(请求):
form = someform(request.post)
如果form.is_valid():
data = form.clenet_data
#安排任务以稍后进行数据
do_something_with_form_data.delay(data)(数据)
返回render_to_response(...)
#tasks.py
@任务
def do_something_with_form_data(数据):
call_slow_web_service(data ['用户'],data ['text'],...)
10.调试
由于克莱里的操作需要启动多个组件,因此我们可能会错过一两个组件。因此,我们建议:
使用最简单的设置
使用Python调试和记录功能显示当前过程
11.渴望模式
如果在设置中的设置。py:
Celery_always_eager = true
然后芹菜以急切的模式运行,然后任务不需要添加延迟即可运行:
#如果启用了急切的模式,则以下两行代码是相同的
add.delay(2,2)
添加(2,2)
12.查看队列
因为我们将Django用作经纪人,所以排在Django数据库中的队列。这意味着我们可以通过Django管理员查看队列:
#admin.py
来自django.contrib导入管理
从kombu.transport.django导入模型为kombu_models
Admin.Site.Register(Kombu_models.message)
13.检查结果
运行异步任务后,芹菜将异步对象返回结果。您可以保存它,然后检查任务是否成功运行并返回结果:
#views.py
结果= add.delay(2,2)
Em
如果结果。dready():
打印“任务已运行”
如果结果。Successful():
打印“结果为:%s”%结果。
别的:
如果是isInstance(结果,例外):
打印“任务失败,原因是提出例外”
提高结果
别的:
打印“任务失败而没有提高例外”
别的:
打印“任务尚未运行”
14.常规任务
还有一种普通的牧师来执行常规任务。执行常规任务时,芹菜将通过芹菜过程完成。将维护芹菜。一段时间后,需要执行一定时间。
走路时,芹菜症将其添加到队列中。与工作过程不同,芹菜只需要一个。
启动CleryBeat:
python manage.py Clery Beat
有很多方法可以使芹菜执行常规任务。让我们先查看第一个,然后将常规任务存储在Django数据库中。即使在Django和Clery中运行的状态
方便地修改常规任务。我们只需要在设置中设置一个即可打开此方法:
#settings.py
Celerybeat_scheduler ='djcelery.schedulers.databasescheduler'
这个话题不是说很多吗?
1:安装python-mysql-connector
2:配置Django的设置文件
数据库= {
'默认': {
'引擎':'django.db.backends.mysql',
“名称”:'dwz',
“用户”:“根”,
“密码”:“夏天”,
“主机”:'127.0.0.1',
'端口':'3306',
}
}
安装软件
安装Python 2.7,Pycharm,PIP(Python软件包管理工具),Django(pip install django)
部署
Pycharm新Django项目
完成后,目录如下:
sub -directory medjangoproject指示该项目的全局配置,即setttings.py,urls.py和wsgi.py.其中,setttings.py包括系统数据库配置,应用程序配置和其他配置,以及urls.py是
指示Web工程URL映射的配置。
子目录学生是在项目下创建的一个应用程序,包括models.py,tests.py,views.py和其他文件
模板目录是模板文件的目录
Manage.py是Django提供的管理工具。
启动
创建完成后,可以正常启动。单击运行按钮以开始时机错误:
Trackback(最近的最新电话):
文件“ d:/workspace/mydjangoproject/manage.py”,第10行,在模块中
execute_from_command_line(sys.argv)
文件“ d:python27libsite-packagesdjangocooranagements__init__。py”,第338行,在execute_from_commman_line中
utility.execute()
文件“ d:python27libsite-packagesdjangocoranagements __init __. py”,第312行,在执行中
django.setup()
文件“ d:python27libsite-packagesdjango__init __. py”,第18行,在设置中
apps.populate(settings.installed_apps)
文件“ d:python27libsite-packagesdjangoapps egistry.py”,第89行,人口
“重复:%s”%app_config.label)
django.core.exceptions.improperlyconfigured:应用程序标签不是唯一的,重复:admin
它应该是配置冲突,打开settings.py文件,并发现重复管理员配置
instasted_apps =((
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'学生',
治愈
评论丢失后(为什么有这个问题,估计它是一个错误),重新启动,确定
Web项目添加页面
目前,我们尚未编写一行代码,并且程序正在运行!添加一个Hello World页面。
打开学生/views.py文件,输入以下内容
def sayhello(请求):
S ='Hello World!'
current_time = dateTime.dateTime.now()
html ='htmlhead/headbody1%s/h1p%s/p/p/p/html'%(s,current_time)
返回httpresponse(HTML)
打开url.py文件,您需要配置URL映射:
url(r'^student/',sayhello)
当用户输入http:// **/站立时,调用了Sayhello方法。此方法通过httpresponse()返回页面内容作为响应。
重新启动服务,访问
在views.py页面上,该页面所需的元素需要调用httpresponse()类作为对浏览器的响应。相对较大。如果我们需要显示一些动态数据并且页面基本不更改,该怎么办?
例如,当用户面试时,我们想动态显示一些学生的数据。您可以做到这一点:
首先,在模板目录中,创建一个新的sut剂节.html文件。该文件用作模板。内容如下:
呢Doctype HTML
html
头
标题/标题
/头
身体
Ul
{学生中的学生%}
李
id:{student.id}},名称:{{student.name}},年龄:{{student.age}}
/li
{%endfor%}
/ul
/身体
/html
修改views.py文件,添加方法showstuders()
Def ShowStudents(请求):
list = [{id:1,'name':'jack'},{id:2,'name':'rose'}]
返回render_to_response('Student.html',{'sustemans':list})
该方法将列表用作动态数据,并将其绑定在render_to_response方法上与模板页面sutper.html。
添加URL映射,URL(R'^ShowStudents/$',ShowStudents)
修改设置.py模板配置:'dirs':[base_dir+r'emplates'],
重新启动服务,访问,出现:
在这一点上,我们通常可以将一些“动态”数据绑定到模板。但是如何访问数据库?
从数据库中获取所需的数据,在页面上显示它?
首先,您需要安装数据库驱动程序,即mysql_python,
然后配置数据库连接:
数据库= {
'默认': {
'引擎':'django.db.backends.mysql',
“名字”:“学生”,
“用户”:“根”,
'密码':'1234',
“主机”:'127.0.0.1',
'端口':'3306',
#'name':os.path.join(base_dir,'db.sqlite3'),
}
}
配置完成后,您需要检测数据库配置是否正确。使用Manage.py Shell命令输入Shell Interactive接口:
进入:
来自django.db导入连接
光标= Connection.Cursor()
如果您不报告错误,则配置是正确的。
创建一个模型,打开Models.py,然后定义模型如下:
班级学生(型号。模型)
id = models.bigintegerfield
name = models.charfield(max_length = 20,默认值='a')
然后致电manage.py syncdb
在正常情况下,完成此步骤后,模型将与数据库一致。但是,在测试中,在成功执行命令后,发现未建立数据库。
对于这种情况,请执行以下操作是正常的:
(1)评论型号。文件代码,执行管理。
[并管理。
(2)打开注释并执行[manage.py makemurations Student and] manage.py迁移命令
通过以上两个步骤,可以正常操作
如何添加views.py:showrealstudents
DEF SHOWREALSTUDENTS(请求):
list = student.objects.all()
返回render_to_response('Student.html',{'sustemans':list})
urls.py添加映射URL(r'^showrealstudents/$',showrealstudents)
重新启动服务并打开连接:
页面输出是正常的。
此时,使用Django可以正常操作数据库,自定义模板并在页面上显示数据。
服务器
由于Django配备了轻型服务器,因此默认使用服务器,但在实际生产中不允许这样做。在生产环境中,Apache HTTPD服务器与MOD_WSGI.SO相结合,作为后端服务器。
以下部署环境是:Python2.7.6
1.安装HTTPD-2.2.25-WIN32-X86-NO_SSL.MSI
2.将下载的mod_wsgi.so放置在D:Program filesapache软件Foundationapache2.2Modules模块。
3.在新建的Web项目中
内容如下(需要修改相应的目录):
导入操作系统
导入系统
djangopath =“ d:/python27/lib/site-ackages/django/bin”
如果djangopath不在sys.path中:
sys.path.append(djangopath)
ProjectPath ='d:/workspace/mydjangoproject'
如果项目路径不在sys.path中:
sys.path.append(Project Path)
apppath ='d:/workspace/mydjangoproject/mydjangoproject'
如果AppPath不在sys.path中:
sys.path.append(apppath)
os.environ ['django_settings_module'] ='mydjangoproject.settings''
来自django.core.wsgi import_wsgi_application
应用程序= get_wsgi_application()
4.修改httpd.conf,添加如下:
loadModule wsgi_module模块/mod_wsgi.so
wsgiscriptalias/“ d:/workspace/mydjangoproject/django.wsgi”
目录“ d:/workspace/mydjangoproject/“”
选项跟随Symlinks
Allowoverride无
命令拒绝,允许
从所有人那里允许
/目录
好的,重新启动服务器,页面是正常的。
在部署过程中,遇到一个例外,如下:
在应用程序注册表准备之前,在应用程序注册表之前初始化翻译插管
原因是django.wsgi从旧写作开始,可以写入新版本。
结论:以上是首席CTO注释的所有内容介绍了如何与Django合并。我希望这对每个人都会有所帮助。如果您仍然想进一步了解这一点,请记住要收集对该网站的关注。