我们之前在project\views 下写过一个index函数,我们判断了如果前端请求方式是get请求,那么返回hello.html页面,如果是其他请求,则告诉用户要用get请求访问。我们用postman试一下
等等,好像哪里不对,我们看看后台日志
System check identified no issues (0 silenced).
February 24, 2022 - 16:57:28
Django version 3.2.3, using settings ‘caseplatform.settings’
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
Forbidden (CSRF cookie not set.): /index/
[24/Feb/2022 16:58:29] “POST /index/ HTTP/1.1” 403 2870
这是什么鬼?我们看到Forbidden (CSRF cookie not set.),百度百科说csrf是跨站请求伪造,实际上是django的安全机制,这里我们先不展开讨论,先说下怎么解决,我们打开settings.py文件,找到MIDDLEWARE,注释’django.middleware.csrf.CsrfViewMiddleware’,如下所示
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
改完之后,django会帮我们自动重启,我们再用postman进行访问,如下图所示
想想看,还是有点复杂,我们还要判断前端的请求方式,有没有办法解决这个问题呢?答案肯定是有的,那就是基于类的视图。
我们在project\views.py
添加如下代码
class Index(View):
'''
类视图
'''
def get(self, request):
return HttpResponse("这是一个get请求")
def post(self, request):
return HttpResponse("这是一个post请求")
def delete(self, request):
return HttpResponse("这是一个delete请求")
def put(self, request):
return HttpResponse("这是一个put请求")
修改caseplatform\urls.py
from django.contrib import admin
from django.urls import path
from project import views
from project.views import Index #
urlpatterns = [
path('admin/', admin.site.urls),
# path('index/', views.index), # 新增
path('index/', Index.as_view())
]
测试get、post、delete、put请求
如果我们使用其他请求方式访问呢?比如PATCH,django 会报请求方式不被允许。