运用Django进行WEB开发,有三条比较重要的命令值得深入了解一下。
runserver
命令:
python manage.py runserver [addrport]
(manage.py也可改为django-admin)
其中addrport为端口号。常能看到命令:“python manage.py runserver 127.0.0.1:8000”。执行意义:在本地机器上启动一个轻量级的开发网络服务器。默认情况下,该服务器在 IP 地址 127.0.0.1 的 8000 端口上运行。你可以明确地传递一个 IP 地址和端口号。(源于Django官网)所以执行该命令之后,正确情况下就能启动Django项目。
collectstatic
命令:
python manage.py collectstatic
(manage.py也可改为django-admin)
看英文名就可以猜其意,"collect static"收集静态。意义就是:将静态文件收集到STATIC_ROOT。
比如在部署项目时,往往需要将静态文件打包,而本地的静态文件目录往往是不会被直接加载进去的,这就需要打包,而Django部署项目,就需要collectstatic进行打包,而该命令并不是必须执行的。但在部署上线项目时,有时就会发现静态文件CSS、JS文件等未被找到,样式全无的现象。
在Django项目中,当在本地运行的静态文件生效而服务器不生效,这里如果是JS文件,那么可以用开发者工具检查是不是跑404错误,若是,则说明该静态资源未被成功加载。有两种解决尝试:1.把前端的JS文件引入从相对静态路径改为对应网址引入,比如:
/static/element-ui/lib/index.js ==>
https://unpkg.com/element-ui/lib/index.js
或者 2.在配置文件中记录好静态位置,载入static,比如:
{% load static %}
{% static "element-ui/lib/index.js" %}
同时,根据DJANGO官网提供,findstatic命令:
python manage.py findstatic element-ui/lib/index.js
查询是否打包入该静态文件。
目前新型的开发框架,比如腾讯蓝鲸开发框架,是会在部署上PaaS平台上进行打包,而不会使用本地打包的文件(就是本地的STATIC_ROOT)(一般都能从日志查到对应的collectstatic操作命令结果),此时就可以在本地进行打包测试,找到对应的STATIC_ROOT看文件是否存在或findstatic命令查询,或者部署后预发布环境用开发者工具测试。
本地在runserver运行一般就需访问到需使用的静态文件,Django会默认去查询配置文件的STATICFILES_DIRS、STATIC_URL、STATIC_ROOT 相关。但部署到服务器上或测试平台上时,本地的static目录与其他打包未上传的文件是无法被读到的。所以其中可能就有静态文件的错误出现。
gunicorn
Gunicorn ('Green Unicorn') 是一个 UNIX 下的纯 Python WSGI 服务器(是一个高性能的Python WSGI HTTP Server)。它没有其它依赖,可以使用 ``pip``安装。
安装命令:
python -m pip install gunicorn
检测是否安装成功命令:
gunicorn -h
此时就不会用manage.py runserver的指令,而是启动服务命令(比如):
gunicorn -w 4 -b 127.0.0.1:8000 wsgi:application
其他参数具体意义在本文最末尾处。
把Django项目部署上服务器就会用到此命令,同时gunicorn也只能在Linux环境下使用。用来解析HTTP请求的网关服务。
WSGI HTTP Server:
WSGI(Web Server Gateway Interface),是为了让web和app解耦再把它们连接起来,在Web Server和Web APP之间的一种通用接口开发规范。
pre-fork worker model:
用gunicorn启动时,主线程会调用listen方法绑定指定好的URL和端口,并获取文件描述符,且有fork(复刻)出的多个子线程worker被传递文件描述符做处理,全部的worker会被另一个线程master管控着,master不负责处理请求。这些worker处理完HTTP请求与被Web APP调用后,再整理成HTTP Response,通过TCP返回给客户端。
-c CONFIG : CONFIG,配置文件的路径,通过配置文件启动;生产环境使用;
-b ADDRESS : ADDRESS,ip加端口,绑定运行的主机;
-w INT, --workers INT:用于处理工作进程的数量,为正整数,默认为1;
-k STRTING, --worker-class STRTING:要使用的工作模式,默认为sync异步,可以下载eventlet和gevent并指定
--threads INT:处理请求的工作线程数,使用指定数量的线程运行每个worker。为正整数,默认为1。
--worker-connections INT:最大客户端并发数量,默认情况下这个值为1000。
--backlog int:未决连接的最大数量,即等待服务的客户的数量。默认2048个,一般不修改;
-p FILE, --pid FILE:设置pid文件的文件名,如果不设置将不会创建pid文件
--access-logfile FILE :要写入的访问日志目录
--access-logformat STRING:要写入的访问日志格式
--error-logfile FILE, --log-file FILE :要写入错误日志的文件目录。
--log-level LEVEL :错误日志输出等级。
--limit-request-line INT :HTTP请求头的行数的最大大小,此参数用于限制HTTP请求行的允许大小,默认情况下,这个值为4094。值是0~8190的数字。
--limit-request-fields INT :限制HTTP请求中请求头字段的数量。此字段用于限制请求头字段的数量以防止DDOS攻击,默认情况下,这个值为100,这个值不能超过32768
--limit-request-field-size INT :限制HTTP请求中请求头的大小,默认情况下这个值为8190字节。值是一个整数或者0,当该值为0时,表示将对请求头大小不做限制
-t INT, --timeout INT:超过这么多秒后工作将被杀掉,并重新启动。一般设定为30秒;
--daemon:是否以守护进程启动,默认false;
--chdir:在加载应用程序之前切换目录;
--graceful-timeout INT:默认情况下,这个值为30,在超时(从接收到重启信号开始)之后仍然活着的工作将被强行杀死;一般使用默认;
--keep-alive INT:在keep-alive连接上等待请求的秒数,默认情况下值为2。一般设定在1~5秒之间。
--reload:默认为False。此设置用于开发,每当应用程序发生更改时,都会导致工作重新启动。
--spew:打印服务器执行过的每一条语句,默认False。此选择为原子性的,即要么全部打印,要么全部不打印;
--check-config :显示现在的配置,默认值为False,即显示。
-e ENV, --env ENV:设置环境变量;
“wsgi:application”即项目根目录下的wsgi.py文件,application为自定义的app命名。
gunicorn详情,内容参考文章(其实例部分可不看):
http://t.csdn.cn/CCfZN
其文章最后的图片部分可助于理解gunicorn步骤流程:
http://t.csdn.cn/k5WGS
gunicorn各类命令参考:
http://www.manongjc.com/detail/12-ohdxvmyasuzxzcu.html
内容参考Django官网:
docs.djangoproject.com
具体其他参数命令可搜索Django官网的DOCUMENTATION(文件)搜索命令词:runserver、collectstatic、gunicorn,或关键词全局搜索即可。
想一起学更多编程与数学知识,欢迎关注我的公众号:一路向东
(一名数学专业的腾讯开发工程师邀请你)