2024-11-03 02:53:54
导读:今天首席CTO笔记来给各位分享关于django是如何运行多个项目的的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
django一个项目多个App项目搭建django可以在一个项目中存在多个app,如一个大门户网站中可以包含论坛,新闻等内容,其中每一个模块称之为一个App,也可以理解为一个个独立的小型项目最终集成在一个门户网站中最终呈现给用户
本次测试以python2.7
其次分别建立相应的App模块:todo,oa,web
如图所示:
在以上的配置中导入了include对配置进行包装
同时导入了index函数,index在todo,oa,web中的views文件分别建立
同时指定了一个打开的默认首页,即webapp下的index/pre
此时运行程序,页面如图所示
如果此时输入的路径为localhost:8000/web/inex,
localhost:8000/oa/inex,
localhost:8000/toto/index将得到不同app的展现,
Django中怎么使用django-celery完成异步任务许多Django应用需要执行异步任务,以便不耽误httprequest的执行.我们也可以选择许多方法来完成异步任务,使用Celery是一个比较好的选择,因为Celery
有着大量的社区支持,能够完美的扩展,和Django结合的也很好.Celery不仅能在Django中使用,还能在其他地方被大量的使用.因此一旦学会使用Celery,我
们可以很方便的在其他项目中使用它.
1.Celery版本
本篇博文主要针对Celery3.0.x.早期版本的Celery可能有细微的差别.
2.Celery介绍
Celery的主要用处是执行异步任务,可以选择延期或定时执行功能.为什么需要执行异步任务呢?
第一,假设用户正发起一个request,并等待request完成后返回.在这一request后面的view功能中,我们可能需要执行一段花费很长时间的程序任务,这一时间
可能远远大于用户能忍受的范围.当这一任务并不需要立刻执行时,我们便可以使用Celery在后台执行,而不影响用户浏览网页.当有任务需要访问远程服务器完
成时,我们往往都无法确定需要花费的时间.
第二则是定期执行某些任务.比如每小时需要检查一下天气预报,然后将数据储存到数据库中.我们可以编写这一任务,然后让Celery每小时执行一次.这样我们
的web应用便能获取最新的天气预报信息.
我们这里所讲的任务task,就是一个Python功能(function).定期执行一个任务可以被认为是延时执行该功能.我们可以使用Celery延迟5分钟调用function
task1,并传入参数(1,2,3).或者我们也可以每天午夜运行该function.
我们偏向于将Celery放入项目中,便于task访问统一数据库和Django设置.
当task准备运行时,Celery会将其放入列队queue中.queue中储存着可以运行的task的list.我们可以使用多个queue,但为了简单,这里我们只使用一个.
将任务task放入queue就像加入todolist一样.为了使task运行,我们还需要在其他线程中运行的苦工worker.worker实时观察着代运行的task,并逐一运行这
些task.你可以使用多个worker,通常他们位于不同服务器上.同样为了简单起见,我们这只是用一个worker.
我们稍后会讨论queue,worker和另外一个十分重要的进程,接下来我们来动动手:
3.安装Celery
我们可以使用pip在vietualenv中安装:
pipinstalldjango-celery
4.Django设置
我们暂时使用djangorunserver来启动celery.而Celery代理人(broker),我们使用Djangodatabasebrokerimplementation.现在我们只需要知道Celery
需要broker,使用django自身便可以充当broker.(但在部署时,我们最好使用更稳定和高效的broker,例如Redis.)
在settings.py中:
importdjcelery
djcelery.setup_loader()
BROKER_URL='django://'
...
INSTALLED_APPS=(
...
'djcelery',
'kombu.transport.django',
...
)
第一二项是必须的,第三项则告诉Celery使用Django项目作为broker.
在INSTALLED_APPS中添加的djcelery是必须的.kombu.transport.django则是基于Django的broker
最后创建Celery所需的数据表,如果使用South作为数据迁移工具,则运行:
pythonmanage.pymigrate
否则运行:(Django1.6或Django1.7都可以)
pythonmanage.pysyncdb
5.创建一个task
正如前面所说的,一个task就是一个Pyhtonfunction.但Celery需要知道这一function是task,因此我们可以使用celery自带的装饰器decorator:@task.在
djangoapp目录中创建taske.py:
fromceleryimporttask
@task()
defadd(x,y):
returnx+y
当settings.py中的djcelery.setup_loader()运行时,Celery便会查看所有INSTALLED_APPS中app目录中的tasks.py文件,找到标记为task的function,并
将它们注册为celerytask.
将function标注为task并不会妨碍他们的正常执行.你还是可以像平时那样调用它:z=add(1,2).
6.执行task
让我们以一个简单的例子作为开始.例如我们希望在用户发出request后异步执行该task,马上返回response,从而不阻塞该request,使用户有一个流畅的访问
过程.那么,我们可以使用.delay,例如在在views.py的一个view中:
frommyapp.tasksimportadd
...
add.delay(2,2)
...
Celery会将task加入到queue中,并马上返回.而在一旁待命的worker看到该task后,便会按照设定执行它,并将他从queue中移除.而worker则会执行以下代
码:
importmyapp.tasks.add
myapp.tasks.add(2,2)
7.关于import
这里需要注意的是,在impprttask时,需要保持一致.因为在执行djcelery.setup_loader()时,task是以INSTALLED_APPS中的app名,
加.tasks.function_name注册的,如果我们由于pythonpath不同而使用不同的引用方式时(例如在tasks.py中使用frommyproject.myapp.tasksimport
add形式),Celery将无法得知这是同一task,因此可能会引起奇怪的bug.
8.测试
a.启动worker
正如之前说到的,我们需要worker来执行task.以下是在开发环境中的如何启动worker:
首先启动terminal,如同开发django项目一样,激活virtualenv,切换到django项目目录.然后启动django自带web服务器:pythonmanage.pyrunserver.
然后启动worker:
pythonmanage.pyceleryworker--loglevel=info
此时,worker将会在该terminal中运行,并显示输出结果.
b.启动task
打开新的terminal,激活virtualenv,并切换到django项目目录:
$pythonmanage.pyshell
frommyapp.tasksimportadd
add.delay(2,2)
此时,你可以在worker窗口中看到worker执行该task:
[2014-10-0708:47:08,076:INFO/MainProcess]Gottaskfrombroker:myapp.tasks.add[e080e047-b2a2-43a7-af74-d7d9d98b02fc]
[2014-10-0708:47:08,299:INFO/MainProcess]Taskmyapp.tasks.add[e080e047-b2a2-43a7-af74-d7d9d98b02fc]succeededin0.183349132538s:4
9.另一个例子
下面我们来看一个更为真实的例子,在views.py和tasks.py中:
#views.py
frommyapp.tasksimportdo_something_with_form_data
defview(request):
form=SomeForm(request.POST)
ifform.is_valid():
data=form.cleaned_data
#Scheduleatasktoprocessthedatalater
do_something_with_form_data.delay(data)
returnrender_to_response(...)
#tasks.py
@task
defdo_something_with_form_data(data):
call_slow_web_service(data['user'],data['text'],...)
10.调试
由于Celery的运行需要启动多个部件,我们可能会漏掉一两个.所以我们建议:
使用最简单的设置
使用pythondebug和logging功能显示当前的进程
11.Eager模式
如果在settings.py设置:
CELERY_ALWAYS_EAGER=True
那么Celery便以eager模式运行,则task便不需要加delay运行:
#若启用eager模式,则以下两行代码相同
add.delay(2,2)
add(2,2)
12.查看queue
因为我们使用了django作为broker,queue储存在django的数据库中.这就意味着我们可以通过djangoadmin查看该queue:
#admin.py
fromdjango.contribimportadmin
fromkombu.transport.djangoimportmodelsaskombu_models
admin.site.register(kombu_models.Message)
13.检查结果
每次运行异步task后,Celery都会返回AsyncResult对象作为结果.你可以将其保存,然后在将来查看该task是否运行成功和返回结果:
#views.py
result=add.delay(2,2)
...
ifresult.ready():
print"Taskhasrun"
ifresult.successful():
print"Resultwas:%s"%result.result
else:
ifisinstance(result.result,Exception):
print"Taskfailedduetoraisinganexception"
raiseresult.result
else:
print"Taskfailedwithoutraisingexception"
else:
print"Taskhasnotyetrun"
14.定期任务
还有一种Celery的常用模式便是执行定期任务.执行定期任务时,Celery会通过celerybeat进程来完成.Celerybeat会保持运行,一旦到了某一定期任务需要执
行时,Celerybeat便将其加入到queue中.不像worker进程,Celerybeat只有需要一个即可.
启动Celerybeat:
pythonmanage.pycelerybeat
使Celery运行定期任务的方式有很多种,我们先看第一种,将定期任务储存在django数据库中.即使是在django和celery都运行的状态,这一方式也可以让我们
方便的修改定期任务.我们只需要设置settings.py中的一项便能开启这一方式:
#settings.py
CELERYBEAT_SCHEDULER='djcelery.schedulers.DatabaseScheduler'
github+django+pythonanywhere+wsgi部署项目??这两天又试着在一个新平台Pythonanywhere上部署了项目,现在此记录一下过程,主要是强化一下记忆,要是能帮上其他人就再好不过了。
我想程序员对这个网站再熟悉不过了,我也不多介绍了,在整个过程中,GitHub的作用是当做一个中介平台,我先把本地的项目push到GitHub的仓库里,然后在第三方服务器上进行克隆和部署。
我这里就直接截取一段维基上的介绍吧
PythonAnywhereisanonlineIntegratedDevelopmentEnvironment(IDE)andWebhostingservicebasedonthePythonprogramminglanguage.[1]Itprovidesin-browseraccesstoserver-basedPythonandBashCommand-lineinterfaces,alongwithacodeeditorwithSyntaxhighlighting.Programfilescanbetransferredtoandfromtheserviceusingtheuser'sbrowser.WebapplicationshostedbytheservicecanbewrittenusinganyWSGI-basedapplicationframework.
首先注册一个免费账号,虽然功能有限,但是作为实验够用了,登陆之后打开一个bash,然后克隆GitHub的项目
然后可以创建虚拟环境,这样可以并存多个项目。接着安装Django。接着运行
注意环境里Python2和python3两个版本,根据你的需要使用,接下来就可以发布项目了,注意不要选择默认的Django设置,要选择手动的设置。
接下来就该配置wsgi文件了,wsgi实际上是一个协议规范,规定了web服务器和web应用之间的接口。
配置好以后reload项目,如果正常的话应该就可以启动了。如果没有正常启动,那么你应该看看你的日志文件。
这是一个简单的部署活动,但是其他的项目也八九不离十,重要的是这样一种开发方式,本地开发,测试好以后直接push到生产环境。
如何在服务器上部署Django项目并使其在后台一直运行前几天老师让我把一个Django项目(爬虫网页)放到校园内网上,但是我想先用自己的服务器来尝试一下。之前刚好有在DigitalOcean上买过服务器用来运行ss脚本,平时服务器一直放着没啥用,所以就拿它来试验一下。
废话不多说,第一步通过WinSCP软件把Django文件传到服务器上。
在服务器中安装Django需要的环境和我所需要的Python第三方库。
以上所有步骤完成后,还需要进行一步操作,这是我经历的一个坑。打开Django文件目录中的settings.py,把ALLOWED_HOSTS=[]改为ALLOWED_HOSTS=["*"]。
在服务器中打开到manage.py所在的目录,输入命令:
python3manage.pyrunserver0.0.0.0:8000
然后按下回车,在浏览器中输入:该服务器IP地址:8000,大功告成!
Attention:
1.python3不是特定的,是根据你的Django项目所需要的环境指定的。
2.8000是端口号,可以修改。
如果想要Django项目一直运行,关闭终端后还在运行,即需要运行如下命令,nohupcommand,command即位上文所说的python3manage.pyrunserver0.0.0.0:8000。
Django+nginx+uwsgi部署多个项目xxxxnginx配置如下:
xxxxuwsgi配置如下:
命令:systemctlrestartnginx
命令:/home/env/xxxxenv/bin/uwsgi--ini/home/conf/xxxxuwsgi.ini
结语:以上就是首席CTO笔记为大家整理的关于django是如何运行多个项目的的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~