在部署DRF(Django Rest Framework)项目时遇到了大量的问题,也学习了大量的博客,终于才将项目正确部署在Linux: Ubuntu服务器上,下面记录部署过程中踩过的坑。
整个项目下有Font(前端的静态文件)和VisualPytorch(后端的django项目)两个文件夹,VisualPytorch
作为django项目目录下每个文件夹都是一个app,还有一个用于管理项目的manage.py
,还有一个同名的文件夹VisualPytorch
,下面的settings.py
,uwsgi.py
均为django自动生成的,用于部署的文件。
将visualpytorch项目克隆下来以后,并不能直接运行,作为DRF前后端分离的项目,需要将后端服务器运行起来,并通过文件的方式访问对应的页面(不能直接访问127.0.0.1:8000,因为在DRF项目中并未将index页面加入路由,而且静态页面也完全没必要)。
因为前后端是分离的,前端的html等静态文件,与后端Django项目文件是相对分离的。后端不需要写入前端的路由,前端也不用太关系后端的运行方式。只有在前端向后端发起GET请求时,才会给后端一个json,相应的,后端工作完成后返回一个json给前端。
首先需要配置数据库:在项目文件夹config下新建个db.py,内容为:
NAME=‘本地数据库名‘
HOST=‘localhost‘
PORT=3306
USER=‘用户名‘
PASSWORD=‘密码‘
打开mysql,并创建连接,用户名密码与db.py一一对应,在连接中创建对应名字的数据库,并保证开启状态:
后台运行mysql时,DRF会自动寻找对应的数据库,接下来就可以迁移数据及运行了,在项目文件夹下依次运行下列命令:
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
不能通过127.0.0.1:8000打开,而应该通过静态文件,所以设置浏览器的打开方式,以Chrome为例:在快捷方式——属性——目标中添加--allow-file-access-from-files
,注意前面一定要有空格!
使用该快捷方式打开static中对应的index.html,就能得到正常跳转的页面了。
在部署的过程中参照了部署Django REST Framework服务(Nginx + uWSGI + Django)。流程大概是对的(先配置好uwsgi,通过http方式能在对应端口上后台运行,再配置nginx,进行反向代理),然而照着教程做不清楚背后的原理,调了很久仍然出问题。
其他学习部署链接:
https://www.jianshu.com/p/f3fd1f831729
https://www.jb51.net/article/137856.html
https://www.bilibili.com/video/BV1xW411o77G?from=search&seid=6001884209692780453
对于Nginx+uWSGI+Django项目,web服务器怎样提供服务?
如图所示(详见服务器部署过程),对于服务器的http请求,nginx如同一个门将请求进行分离,与静态资源进行对接的同时,通过socket与后端uWSGI服务连接,调用相应的django程序。
sql命令行创建visualpytorch数据库方式:
update user set plugin=‘mysql_native_password‘ where user=‘root‘;
update user set authentication_string=password(‘Sunye123‘) where user=‘root‘;
create database visualpytorch default charset utf8 collate utf8_general_ci;
django程序基本上和在本地运行一致,需要打开数据库和migrate,运行runserver时使用curl -i 127.0.0.1:8000/docs
出现正常应答说明运行正常,可以停止runserver,进行下一步(因为uWSGI也可以启动django项目)。
需要注意的是,uWSGI配置之前需要在VisualPytorch/setting.py将STATIC_ROOT设置好,运行python manage.py collectstatic
用以收集静态文件,以备后续nginx使用。
DEBUG = False
,ALLOWED_HOSTS = [‘*‘]
是部署必备的,关闭DEBUG模式,开启其他主机访问。
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
FONT_DIR = os.path.dirname(BASE_DIR) + r"/font"
STATIC_ROOT = os.path.join(FONT_DIR, ‘static/‘)
STATICFILES_DIR = [os.path.join(FONT_DIR,‘‘),]
# SECURITY WARNING: don‘t run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = [‘*‘]
对于uwsgi来说,设置django程序路径,并且设置参数稳定且正确运行是很重要的。可以使用命令行的方式直接启动,如下所示:
uwsgi --chdir=/root/VisualPytorch-develop --module=VisualPytorch/wsgi.py:application --home=/root/anaconda3/envs/visualpytorch \ # optional path to a virtualenv
--socket :8000
也可以写uwsgi_config.ini
文件,将启动的配置记录下来,放在manage.py
同目录下,uwsgi uwsgi_config.ini
以启动。
[uwsgi]
chdir=/home/VisualPytorch-develop/VisualPytorch
module=VisualPytorch.wsgi:application
#http=127.0.0.1:8080
socket= :8000
wsgi-file=VisualPytorch/wsgi.py
master=true
vacuum=true
home=/root/anaconda3/envs/visualpytorch
注:
关闭uWSGI进程的方式:ps -aux | grep uwsgi | awk ‘{print $2}‘ | xargs kill -9
uWSGI成功安装测试方法:
# test.py
def application(env, start_response):
start_response(‘200 OK‘, [(‘Content-Type‘,‘text/html‘)])
return [b"Hello World"] # python3
#return ["Hello World"] # python2
uwsgi --http :8000 --wsgi-file test.py
对于nginx来说,一头监听http端口(一般是80端口),另一头设置uwsgi socket端口和静态资源,如何正确地设置路径时很重要的。
首先需要学习conf文件路径配置的方式,参考nginx与location语法详解,清楚~/*$\.()
符号代表的含义,alias和root的差异。才能正确配置DRF项目对应的conf文件,/etc/nginx/site-available/visualpytorch
参考如下:
server{
listen 80;
server_name visualpytorch;
charset utf-8;
client_max_body_size 75M;
location /static {
alias /home/VisualPytorch-develop/font/static;
}
location ~* \.(css|gif|ico|jpg|js|png|ttf|woff)$ {
root /home/VisualPytorch-develop/font;
}
# 配置uwsgi socket端口
location / {
uwsgi_pass 127.0.0.1:8000;
include /etc/nginx/uwsgi_params;
}
}
注:设置site-enable的静态链接:ln -s /etc/nginx/site-available/visualpytorch /etc/nginx/site-enable/visualpytorch
原文:https://www.cnblogs.com/NAG2020/p/12920154.html