django|uwsgi+Django 部署 前后端不分离web项目

前后端不分离部署方式:

没有静态文件服务器单独提供静态文件,只有后端接口服务器,通过设置路由访问静态文件
开发阶段: django提供的开发web服务器。python manage.py runserver ip:端口
部署: uwsgi-> 遵循wsgi协议web服务器。
Django项目中应用到模板继承,采用前后端分离的模式部署继承模式就不能继续使用了
【django|uwsgi+Django 部署 前后端不分离web项目】目录结构
├── demo
│ ├── db.sqlite3
│ ├── demo
│ │ ├── init.py
│ │ ├── pycache
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ ├── ftest
│ │ ├── admin.py
│ │ ├── apps.py
│ │ ├── init.py
│ │ ├── migrations
│ │ ├── models.py
│ │ ├── pycache
│ │ ├── tests.py
│ │ ├── urls.py
│ │ └── views.py
│ ├── manage.py
│ ├── uwsgi.ini
│ ├── uwsgi.log
│ └── uwsgi.pid
└── front
├── children.html
├── css
│ └── children.css
├── ftest.html
├── js
│ ├── children.js
│ └── jQuery2.0.js
└── static
├── admin
├── css
└── js
1. 安装uwsgi pip install uwsgi
2. 在项目目录/demo 下创建uwsgi配置文件 uwsgi.ini
[uwsgi] #使用nginx连接时使用,Django程序所在服务器地址 ; socket=127.0.0.1:8001 #直接做web服务器使用,Django程序所在服务器地址 http=127.0.0.1:8001 #项目目录(manage.py所在目录) chdir=/home/python/Desktop/django/demo # 如果修改/碰了指定的文件,那么重载uWSGI touch-reload = DJANGO_DIR #项目中wsgi.py文件的目录,相对于项目目录(写项目目录chdir之后的目录) wsgi-file=demo/wsgi.py # 进程数 processes=4 # 线程数 threads=2 # uwsgi服务器的角色 master=True # 存放进程编号的文件 pidfile=uwsgi.pid # 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。我们以前的runserver是依赖终端的(会生成在与uwsgi.ini平级目录中) daemonize=uwsgi.log # 指定依赖的虚拟环境 virtualenv=/home/python/.virtualenvs/ETL

3. 修改django配置文件
# debug 生产环境修改为False DEBUG = False# Django通过django.contrib.staticfiles来管理静态文件,首先确保django.contrib.staticfiles已经添加到INSTALLED_APPS。 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles',# 确保有 'ftest.apps.FtestConfig', ]# 增加静态文件配置 STATIC_URL = '/static/'# 对外提供WEB访问时static的URL地址# 静态文件收集之后存放的目录 STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'front/static')# 设置绝对路径, 用来保存收集到的静态文件,服务器最终也将从该路径中获取文件进行转发。在collectstatic运行的时候会把STATICFILES_DIRS中的静态文件拷贝到这个目录中,达到从开发环境到生产环节过程中移植静态文件的作用。# 用来配置一些开发环境下生成的静态文件的地址,即front/css, front/js STATICFILES_DIRS = ( ('css',os.path.join(os.path.dirname(STATIC_ROOT),'css').replace('\\','/') ), ('css',os.path.join(os.path.dirname(STATIC_ROOT),'js').replace('\\','/') ), )# 将静态文件中需要需要修改的生产环境的配置一一修改,包括数据库配置等

4. 添加路由 demo/urls.py urls.py文件内容为:
from django.views import static from demo import settings urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^ftest/', include('ftest.urls')), url(r'^static/(?P.*)$', static.serve, {'document_root': settings.STATIC_ROOT}, name='static'),# 添加 ]

可能存在的bug:
from demo import settings 时,最初写做from demo.demo import settings(从BASE_DIR开始写), 运行报错,找不到demo.demo, 改为from demo import settings后,settings单词有红色划线提示,于是将最外层demo文件设置为Sources Root(pyCharm中操作),无法设置资源文件的情况不详
5. 模板文件.html中引用css/js路径修改 访问路径 http://127.0.0.1:8001/ftest/ch/
# 非调用路由的引用方式,调用已经编译好的静态文件front/css, front/js中文件 # 调用路由的引用方式 ''' 注意/static 与 static 区别 href="https://www.it610.com/static/css/children.css" 访问url:http://127.0.0.1:8001/static/css/children.css href="https://www.it610.com/article/static/css/children.css" 访问url:http://127.0.0.1:8001/ftest/ch/static/css/children.css 无法正确通过路由访问到静态文件 '''

6. 收集静态文件 django在生产环境下不直接对外提供静态文件(这里通过设置路由的方法进行访问),但是还有django自身的一些静态文件,比如admin, rest_franework的css,js和其他等,所以通过执行静态文件收集命令来收集
python manage.py collectstatic
7. uwsgi服务器的启用与停用
# 启动 uwsgi --ini uwsgi.ini (配置文件路径) # 启动后生成文件 uwsgi.log日志文件 uwsgi.pid进程号 # 查看日志文件 tail -f uwsgi.log (查看的内容始终为最新) # 停用 uwsgi --stop uwsgi.pid (uwsgi.pid文件路径)

    推荐阅读