发布网友 发布时间:2024-09-30 13:17
共1个回答
热心网友 时间:2024-10-03 06:05
导读:今天首席CTO笔记来给各位分享关于django如何启动服务的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
Django源码阅读(一)项目的生成与启动诚实的说,直到目前为止,我并不欣赏django。在我的认知它并不是多么精巧的设计。只是由功能堆积起来的"成熟方案"。但每一样东西的崛起都是时代的选择。无论你多么不喜欢,但它被需要。希望有一天,python能有更多更丰富的成熟方案,且不再被诟病性能和可维护性。(屁话结束)
取其精华去其糟粕,django的优点是方便,我们这次源码阅读的目的是探究其方便的本质。计划上本次源码阅读不会精细到每一处,而是大体以功能为单位进行解读。
django-adminstartprojectHelloWorld即可生成django项目,命令行是exe格式的。
manage.py把参数交给命令行解析。
execute_from_command_line()通过命令行参数,创建一个管理类。然后运行他的execute()。
如果设置了reload,将会在启动前先check_errors。
check_errors()是个闭包,所以上文结尾是(django.setup)()。
直接看最后一句settings.INSTALLED_APPS。从settings中抓取app
注意,这个settings还不是我们项目中的settings.py。而是一个对象,位于django\conf\__init__.py
这是个Settings类的懒加载封装类,直到__getattr__取值时才开始初始化。然后从Settings类的实例中取值。且会讲该值赋值到自己的__dict__上(下次会直接在自己身上找到,因为__getattr__优先级较低)
为了方便debug,我们直接写个run.py。不用命令行的方式。
项目下建个run.py,模拟runserver命令
debug抓一下setting_module
回到setup()中的最后一句apps.populate(settings.INSTALLED_APPS)
开始看apps.populate()
首先看这段
这些App最后都会封装成为AppConfig。且会装载到self.app_configs字典中
随后,分别调用每个appConfig的import_models()和ready()方法。
App的装载部分大体如此
为了方便debug我们改写下最后一句
res的类型是Commanddjango.contrib.staticfiles.management.commands.runserver.Commandobjectat0x00000101ED5163A0
重点是第二句,让我们跳到run_from_argv()方法,这里对参数进行了若干处理。
用pycharm点这里的handle会进入基类的方法,无法得到正确的走向。实际上子类Commond重写了这个方法。
这里分为两种情况,如果是reload重载时,会直接执行inner_run(),而项目启动需要先执行其他逻辑。
django项目启动时,实际上会启动两次,如果我们在项目入口(manage.py)中设置个print,会发现它会打印两次。
第一次启动时,DJANGO_AUTORELOAD_ENV为None,无法进入启动逻辑。会进入restart_with_reloader()。
在这里会将DJANGO_AUTORELOAD_ENV置为True,随后重启。
第二次时,可以进入启动逻辑了。
这里创建了一个django主线程,将inner_run()传入。
随后本线程通过reloader.run(django_main_thread),创建一个轮询守护进程。
我们接下来看django的主线程inner_run()。
当我们看到wsgi时,django负责的启动逻辑,就此结束了。接下来的工作交由wsgi服务器了
这相当于我们之前在fastapi中说到的,将fastapi的app交由asgi服务器。(asgi也是django提出来的,两者本质同源)
那么这个wsgi是从哪来的?让我们来稍微回溯下
这个settings是一个对象,在之前的操作中已经从settings.py配置文件中获得了自身的属性。所以我们只需要去settings.py配置文件中寻找。
我们来寻找这个get_wsgi_application()。
它会再次调用setup(),重要的是,返回一个WSGIHandler类的实例。
这就是wsgiapp本身。
load_middleware()为构建中间件堆栈,这也是wsgiapp获取setting信息的唯一途径。导入settings.py,生成中间件堆栈。
如果看过我之前那篇fastapi源码的,应该对中间件堆栈不陌生。
app入口→中间件堆栈→路由→路由节点→endpoint
所以,wsgiapp就此构建完毕,服务器传入请求至app入口,即可经过中间件到达路由进行分发。
windows安装django之后怎么启动
首先进去软件,然后file--settings--ProjectInterpreter在这右边会有你安装的包。第一次应该是什么都没有的然后--点击最下面的,安装pipsetuptools。安装完成之后,点右上角的“+”号在里面搜索,你想要安装的框架模块然后就可以了。
如何实现Django启动服务器时一起启动socket监听您好,很高兴为您解答:
importos
importsys
fromtestSocket.testsimportsocketMethod
if__name__=="__main__":
socketMethod()
os.environ.setdefault("DJANGO_SETTINGS_MODULE","testDjango.settings")
fromdjango.core.managementimportexecute_from_command_line
execute_from_command_line(sys.argv)
defsocketMethod():
print"Runsocket"
s=socket.socket()
host=socket.gethostname()
port=12345
s.bind((host,port))
s.listen(10)
whileTrue:#这里要一直开启监听socket
c,addr=s.accept()
printaddr
c.send("OK")
c.close()
转载,仅供参考。希望以上信息可以帮到您!
django怎么重启服务器如果你是用runserver来运行程序的话,
你可以直接Ctrl+c,关掉后再运行pythonmanager.pyrunserver重启。
或者你可以打开settings.py中的debug参数,这样如果你修改了python代码,它会自动重启服务。
如果解决了您的问题请采纳!
如果未解决请继续追问!
如何用Nginx部署Django如果你在windows上开发的django项目。部署的话,需要分三步。
第一步:在linux下下载python用的依赖包,搭建python环境。将windows下的项目复制到linux下,使用django自带服务进行启动。
第二步:下载uwsgi模块并且编写配置文件来替代django自带的服务模块。
第三步:下载nginx包,编译安装。然后创建配置文件,配置nginx启动django项目的信息。然后访问即可。
结语:以上就是首席CTO笔记为大家介绍的关于django如何启动服务的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。