跨域,调试与部署

严格来说,这个章节应该放到第二章之后,在购买并完成服务器基础配置后再将后端项目迁移到服务器上。但由于跨域问题的解决需要在后端代码中修改很多东西,为保证教程学习体验,决定将这一小部分内容提前。所以阅读本小节之前请先阅读第二章中服务器购买与配置部分。

什么是跨域

所谓跨域,就是指浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,就是跨域访问 。同域就是域名、端口、协议全部都相同,我们称之为同域访问。在实际部署中,最常见的导致跨域的原因就是前端和后端部署在两台不同的服务器上。如果产生了跨域,后端服务就无法正常访问,影响网站的运行。为解决这个问题,需要在后端的配置文件中做一些修改。

跨域的解决

首先,在本地以及服务器上安装一个 Django 插件:

pip install django-cors-headers

然后在项目的settings.py中,进行如下配置:

INSTALLED_APPS = [
    ......
    'corsheaders',
    ......
]

MIDDLEWARE = [
    ......
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',# 注意顺序
    ......
]

ALLOWED_HOSTS = ['*'] # 注意这里是修改,原本是[]

# 跨域增加忽略
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True

CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
    'VIEW',
)

CORS_ALLOW_HEADERS = (
    'XMLHttpRequest',
    'X_FILENAME',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
    'Pragma',
)

修改完成后,就可以在云端进行测调试了。修改完成后的代码已同步至示例项目中,对应提交为fix: cors error

云端调试

购买的腾讯云服务器默认是带有 Git 的,可以通过下面的命令查看版本:

git --version

直接使用 Git ,通过下面的命令将示例项目拉取到服务器上:

git clone https://github.com/Super-BUAA-2021/Django-demo.git

成功拉取后可以看到如下输出:

image-20220220194455887

进入项目文件夹,将其运行起来:

python manage.py runserver 0.0.0.0:8000

然后在 Postman 中测试下接口:

image-20220222194653636

箭头指的地方需要换成服务器IP:端口。如果一切正常,就会看到和本地一样的返回结果。至此,后端就可以在云端正常运行并可以向前端提供服务了。

但是,上面这种运行方法有一个缺陷,如果关掉链接服务器的程序,则后端程序也会被中止,所以需要调整下运行的方式。在项目文件夹下新建run.py,里面内容为:

import os
import platform

os.system("python manage.py makemigrations")
os.system("python manage.py migrate")

if platform.system() != "Linux":
    os.system("python manage.py runserver")
    # 本地环境,直接运行
else:
    os.system("python manage.py runserver 0.0.0.0:8000 > log.txt & \n")
    print("The backend is running!")
    # 服务器环境,后台运行

新建kill.py

import os
os.system("ps -ef | grep \"runserver\" > log.txt")
F=open("log.txt","r")
a = F.readline().split()
b = F.readline().split()
print("The process id are %s and %s."%(a[1],b[1]))

os.system("kill -9 " + a[1])
os.system("kill -9 " + b[1])
print("They have been successfully killed!")

# Django 在后台运行时会产生两个进程
# 通过命令找出并 kill 掉

以后在运行后端项目时,只需要python run.py即可,本地和服务器端都是这句命令。在服务器端想更新下后端代码,则需要先用python kill.py杀掉上次的项目,然后git pull什么的随便更新下,再运行即可。

大概效果如下图所示:

image-20220222195440287

当然,在一些情况下,需要改成手动运行的模式。比如在对接时出现了 500 错误,除了让前端在浏览器中翻出来报错信息,更方便的做法是改成手动运行模式然后看后端的报错输出。

总结

到这里,后端就可以在服务器上 24 小时运行了。如果上面两个小脚本如果有更好的写法,欢迎在评论区交流。示例项目已完成对应的修改,最后一次提交为add: run && kill

关于 Git,我所购买的腾讯云服务器可以直接clonepull,速度非常快,没有出现超时无法连接的情况。如果发生超时,需要手动进行一定的配置,本教程就不再展开介绍(主要是配置这东西很玄学)。

Copyright © Marvolo 2021 all right reserved,powered by Gitbook该文章修订时间: 2022-02-22 12:01:22

results matching ""

    No results matching ""