部署方式
最初打算将Django项目部署到Nginx服务器,此部署除了需要Nginx服务器外,还需要一个和Nginx服务器进行通信的协议软件-----uwsgi。
可是,经过尝试,最终没能成功将uwsgi安装在win10服务器上,搜到关于uwsgi教程都是在linux上的部署。服务器都是win10,所以最终选择部署在IIS上。
Django+Vue的项目,实际部署的时候有两种方法:
1.在Django上集成vue,也就是在settings.py配置templates目录到vue的dist目录,这样可以实现在Django的服务上直接调取vue前端,后端api还是使用Django的。
2.Django自己启服务,只提供API,vue自己启动服务,只提供前端。比如Django部署在IIS,Vue前端部署在nginx上,然后通过代理访问后端。
刚开始采用第二种方法,最后前后端代理死活调不通,最后采用了第一种方法。
部署的前提是前后端分别能够各自运行且请求正常。
具体的实现步骤参考大佬的文章:
https://blog.csdn.net/weixin_44697492/article/details/117734558
https://blog.csdn.net/m0_38051293/article/details/102470224
本项目主要参考第一个教程
踩坑环节:
1.FastCGI添加环境变量的时候,DJANGO_SETTINGS_MODULE路径是settings.py文件的路径,笔者的路径是settings文件夹下的dev.py文件,所以路径是第三行。后端根目录下的web.config文件中路径保持一致。
Name: DJANGO_SETTINGS_MODULE
Value:drf_admin.settings(drf_admin是自己的项目名称)
Value:drf_admin.settings.dev
本项目根目录下web.config文件配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appSettings>
<add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()" />
<add key="PYTHONPATH" value="%ROOTDIR%" />
<add key="DJANGO_SETTINGS_MODULE" value="drf_admin.settings.dev" />
</appSettings>
<system.webServer>
<handlers>
<remove name="DjangoFastCgiModule" />
<add name="DjangoFastCgiModule" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\Python37\python.exe|E:\drf_admin-master\wfastcgi.py" resourceType="Unspecified" />
</handlers>
<directoryBrowse enabled="true" />
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
</system.webServer>
</configuration>
2.settings/dev.py配置:
DEBUG = False
ALLOWED_HOSTS = ['*']
STATIC_ROOT = 'E:\drf_admin-master\static' # 后端静态文件路径
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "E:\\drf_admin-master\\frontend\\dist\\static\\"),
] # 前端静态文件路径
3.前后端其实都是在各自的服务器上的,Django在127.0.0.1:8000上,Vue在127.0.0.1:8080上,我们需要把他们放到一起,此时就需要用到Django的TemplateView,将其指向我们刚才生成的前端工程frontend下的dist文件即可。
找到内层drf_admin文件夹下的urls.py,修改代码如下:
from django.views.generic import TemplateView
path('', TemplateView.as_view(template_name="index.html")),
由于我们使用了Django的模板系统,所以需要配置一下模板使Django知道从哪里找到index.html。在 内层drf_admin文件夹下的settings/dev.py下,修改代码如下:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': ['E:\\drf_admin-master\\frontend\\dist\\'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
4.接口中查询是GET请求,新增是POST请求,而修改是PUT请求,删除是DELETE请求,IIS服务通常都是支持get和post请求的,由此分析推断很有可能是IIS不支持put和delete谓词请求。
解决方案(针对当前网站,去除WebDav 模块):
修改根目录下web.config文件,在system.webServer标签中添加:
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>