首先我用个前端的测试界面,这是我最近写的一个简单的前端测试界面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>阿贾克斯</title>
<style>
#request{
width: 200px;
height: 100px;
border: solid 1px #90b;
}
</style>
<script>
$.ajaxSetup({
data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
});
</script>
</head>
<body>
<button>
点击发送请求
</button>
<div id="request">
</div>
<script>
const btn = document.getElementsByTagName('button')[0];
btn.onclick = function (){
//1。创建对象
const xhr = new XMLHttpRequest();
//2.初始化
xhr.open('GET', 'http://127.0.0.1:8000/');
//3.发送
xhr.send();
//4.事件绑定
xhr.onreadystatechange=function (){
//处理服务端返回结果
// 判断服务器返回了所有的结果
if(xhr.readyState ===4){
//判断响应状态码
if(xhr.status >= 200 &&xhr.status <300){
//处理结果 行,头,空行,题
//1.响应行
console.log(xhr.status);//状态码
console.log(xhr.statusText);//状态字符吗
console.log(xhr.getAllResponseHeaders())//所有响应头
console.log(xhr.response);
const div = document.getElementsByTagName('div')[0];
div.innerHTML = xhr.response;
}else{
}
}
}
}
</script>
</body>
</html>
后端Django代码,首先是根目录下的url
from django.contrib import admin
from django.urls import path
from django.urls import include
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index),
]
接下来是处理url下的请求的view.py
from django.http import HttpResponse,JsonResponse
def index(request):
if request.method == 'GET':
print(request)
return HttpResponse('HELLO AJAX')
if request.method == 'POST':
print(request.POST)
return HttpResponse('HELLO AJAX')
接下来是典型的跨域问题:如图
控制台报错是跨域问题
可以打开这个请求的明明,数据都返回了
但是按照服务逻辑应该出现的
通过第三方包方式:https://github.com/ottoyiu/django-cors-headers
注意:第三方包对Django的版本有要求
INSTALLED_APPS = [
...
'corsheaders',
...
]
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = ()
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
CORS_ALLOW_HEADERS = (
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
)
可以看到,成功发送并接收。完美解决。
我用的Django是3.2版本的。给大家参考。