0%

Django向后端传递参数

通过正则表达式传递参数

简单实现

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/

效果:

image-20200705195438261

在映射的方法中按照连接中正则表达式的先后顺序传值给函数

绑定变量名

如果我们链接中出现正则表达式的顺序与变量名不同,需要绑定参数名

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), # 参数传递方式二,正则表达式与变量名绑定
]

效果:

image-20200705195838100

通过请求传递参数

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), # 参数传递方式三,GET请求
]

request.GET是一个dict类型,我们用`request.GET[‘变量名’]的方式也可以。

效果:

image-20200705200434836

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), # 参数传递方式四,Post请求
]

注意此处的装饰器@csrf_exempt

因为当用post提交数据的时候,Django会去检查是否有一个csrf的随机字符串,否则会拦截。

因为我用的是postman,所以跨站请求会被拦截,有两种解决方式:

  1. 添加装饰器
  2. 注释掉相关中间件

我选择的第一种,第二种方式为:

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中没有设置全局中间件。

效果:

image-20200705201404750

坑点

  1. post的请求链接最后的/别忘了

  2. 这里只能用表单形式(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)})

    效果:

    image-20200705202518743

-----------看到底线啦 感谢您的阅读-------------