通过正则表达式传递参数 简单实现 views.py 1 2 def goodbye (request, ID, name) : return HttpResponse(str(ID) + ' Good Bye, ' + name)
urls.py 1 2 3 4 urlpatterns = [ path('admin/' , admin.site.urls), url(r'^goodbye/(\d+)/(\w+)/$' , views.goodbye), ]
最后的$
表示链接后边不管是啥也要用goodbye这个函数,比如
localhost:8000/goodbye/1/wei/a
localhost:8000/goodbye/1/wei/b
都同等与
localhost:8000/goodbye/1/wei/
效果:
在映射的方法中按照连接中正则表达式的先后顺序传值给函数
绑定变量名 如果我们链接中出现正则表达式的顺序与变量名不同,需要绑定参数名
views.py 1 2 def msg (request, age, name) : return HttpResponse('My name is ' + name + ',i am ' + age + ' years old' )
urls.py 1 2 3 4 urlpatterns = [ path('admin/' , admin.site.urls), url(r'^msg/(?P<name>\w+)/(?P<age>\d+)/$' , views.msg), ]
效果:
通过请求传递参数 GET请求 views.py 1 2 3 4 5 def get (request) : if request.method == 'GET' : ID = request.GET.get('id' , default=0 ) name = request.GET.get('name' , default='undefined' ) return HttpResponse('Your id is ' + str(ID) + ', and your name is ' + name)
urls.py 1 2 3 4 urlpatterns = [ path('admin/' , admin.site.urls), url(r'^get/' , views.get), ]
request.GET是一个dict类型,我们用`request.GET[‘变量名’]的方式也可以。
效果:
POST请求 views.py 1 2 3 4 5 6 @csrf_exempt def post (request) : if request.method == 'POST' : ID = request.POST.get('id' , default=0 ) name = request.POST.get('name' , default='undefined' ) return HttpResponse('Your id is ' + str(ID) + ', and your name is ' + name)
urls.py 1 2 3 4 urlpatterns = [ path('admin/' , admin.site.urls), url(r'^post/' , views.post), ]
注意此处的装饰器@csrf_exempt
因为当用post提交数据的时候,Django会去检查是否有一个csrf的随机字符串,否则会拦截。
因为我用的是postman,所以跨站请求会被拦截,有两种解决方式:
添加装饰器
注释掉相关中间件
我选择的第一种,第二种方式为:
settings.py 1 2 3 4 5 6 7 8 9 10 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', + #'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
在第二种方式下,使用@csrf_protect
为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
效果:
坑点
post的请求链接最后的/
别忘了
这里只能用表单形式(x-www-form-urlencoded),json格式传递之后要获取请求体并处理。
views.py 1 2 3 4 @csrf_exempt def postJson (request) : print(request.body) return JsonResponse({'status' : 200 , 'result' : str(request.body)})
效果: