Postwoman是一个用于替代Postman,免费开源、轻量级、快速且美观的API调试工具。笔者被朋友推荐,于是采用这个作为后端接口的测试工具,以下是postwoman的web界面内容
## 测试django接口
由于是本地的小项目,于是直接使用http://127.0.0.1:8000/xxx
以get请求进行测试,然而明明这么简单的东西居然没有正常返回。于是在浏览其中按F12
进入开发者模式,进入Network
栏查看发现,当前请求好像除了点问题:
大概内容就是status=blocked,transferred=CORS missing Allow Origin
,然后在开发者模式查看了下响应,发现前端的确收到了后端传来的文件,但是页面当中却一直呈现network error
错误,找了前端同学请教一番,原来是跨域请求的问题。
笔者查看网上资源,发现了比较经典的解决方法
setting.py
:pip install django-cors-headers
,INSTALLED_APPS =(
...
' corsheaders ',
...
)
MIDDLEWARE = [
...
# 跨域请求中间件
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
setting.py
文件后添加# 跨域允许的请求方式,可以使用默认值,默认的请求方式为:
# from corsheaders.defaults import default_methods
CORS_ALLOW_METHODS = (
'GET',
'POST',
'PUT',
'PATCH',
'DELETE',
'OPTIONS'
)
# 允许跨域的请求头,可以使用默认值,默认的请求头为:
# from corsheaders.defaults import default_headers
# CORS_ALLOW_HEADERS = default_headers
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
)
# 跨域请求时,是否运行携带cookie,默认为False
CORS_ALLOW_CREDENTIALS = True
# 允许所有主机执行跨站点请求,默认为False
# 如果没设置该参数,则必须设置白名单,运行部分白名单的主机才能执行跨站点请求
CORS_ORIGIN_ALLOW_ALL = True
python manager.py runserver
django
和 django-cors-headers
版本的问题,笔者用2.0
版,由于一些原因,将不做版本的更换。那得想想其他办法啊,想到之前做视频推流用到nginx
,可以尝试用nginx
配置转发,然后在nginx
端来处理跨域问题(因为项目中需要部署多个服务器,如果每个django服务器都要作者么多工作,就有点麻烦了)。此文不涉及nginx安装及部署工作,只在配置文件nginx.conf
上作相关工作,在nginx中,可以通过在http
或https
中添加server
来实现转发
http{
server{
listen 8081;
location / {
proxy_pass http://127.0.0.1:8000;
}
}
}
如上配置就可以实现将ngnix_ip:8081
的所有请求发送到http://127.0.0.1:8000
中,为了解决跨域问题,在server中添加
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
则nginx.conf
的对应部分变化如下
http {
server {
listen 8081;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
location / {
proxy_pass http://127.0.0.1:8000;
}
}
}
配置完成后重新运行nginx,然后再在postwoman当中以nginx地址进行请求时,便可以得到测试结果了