2.3.1 url ?后面的key value键值对参数(查询字符串参数)
2.3.1 POST请求 表单类型 form-data 与 x-www-form-urlencoded
3.2 获取请求request headers的信息 两种方式
3.2.1 方式一:通过request.headers获取(不常用)
3.2.2 方式二:通过request.META属性获取请求头headers中的数据
一、视图函数介绍
def index(request):
return HttpResponse("hello world!")
1、视图的第一个参数必须为HttpRequest对象,还可能包含下参数如通过正则表达式组获取的位置参数、通过正则表达式组获得的关键字参数。
2、HttpRequest对象包含了请求的所有数据(请求头、请求体)
3、视图函数必须得返回一个HttpResponse对象或者其子类对象。
子对象: JsonResponse HttpResponseRedirect
4、视图负责接受Web请求HttpRequest,进行逻辑处理,返回Web响应HttpResponse给请求者
响应内容可以是HTML内容,404错误,重定向,json数据…
二、HTTPRequest对象(get请求与post请求)
http://127.0.0.1:8000/orders/getOrders/12345?name=zhangsan&age=18
查询字符串参数:name=zhangsan&age=18
HttpRequest对象的属性GET、POST都是QueryDict类型的对象
2.1 url路径参数(前端向后端传递参数)
如请求:
http://127.0.0.1:8000/orders/getOrders/12345?name=zhangsan&age=18
在url路径中传递的参数
在请求实例方法中,使用关键字参数来接收
如:
path("getOrders/<int:order_id>/",views.OrdersView.as_view()),
def get(self,request,order_id):
print(request)
order_data_dic = {
'id': order_id,
'name': '电脑',
'price': '500¥'
}
变量名称在两处要保持一致。
2.2 get 请求传参
HttpRequest对象的属性GET、POST都是QueryDict类型的对象
get请求,一般情况下,只有请求头(headers),没有请求体。
2.3.1 url ?后面的key value键值对参数(查询字符串参数)
如 http://www.xxx.com/?key1=value1&key2=value2
views视图函数中获取传参方式,使用request.GET获取:
1、request.GET返回QueryDict (用户在url传参数的整个数据体),类似于python中dict类型
可以使用[‘key1′]、get(‘key1′),会返回具体的值,如果有多个相同key的键值对,获取的是最后一个
3、getlist(‘key1′),获取相同key的多个值,返回list类型
举例:
def get_demo(request):
request_obj = request.GET
name = request_obj["name"]
age = request_obj.get("age")
json_data = {
"name":name,
"age":age,
"request_obj":request_obj
}
return JsonResponse(json_data)
path('get_demo/',views.get_demo),
注意:
1、查询字符串不区分请求方式,如果客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据。
2.3.3 get其他类型请求体?
2.3 POST请求&请求体
HttpRequest对象的属性GET、POST都是QueryDict类型的对象。
请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,可以是XML字符串,应区别对待。
可以发送请求体数据的请求方式有POST、PUT、PATCH、DELETE。
Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件,
#'django.middleware.csrf.CsrfViewMiddleware',
2.3.1 POST请求 表单类型 form–data 与 x–www-form-urlencoded
表单类型,有2种,form–data 与 x–www-form-urlencoded
区别:
1、x–www-form-urlencoded 表单,value 只能是文本的形式,value只能是字符串或者数字。
对应request heads中的 Content-Type 为 application/x–www-form-urlencoded
(在postman ,在x–www-form-urlencoded 表单下,写数据,postman 会在request headers中自动填充 Content-Type:application/x–www-form-urlencoded)
2、form–data ,value既可以传文本,也可以传二进制数据(文件、视频、图片等)
对应的request headers 中 Content-Type: multipart/form-data;
(在postman中 ,在form-data表单下,写数据,postman 会在request headers中自动填充 Content-Type:multipart/form-data;)
前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象。
1、创建post 视图函数,通过request.POST属性获取传参数
def post_test1(request):
if request.method == 'GET':
return HttpResponse("这是一个get请求")
elif request.method == 'POST':
name = request.POST.get('name')
age = request.POST.get('age')
json_data = {
"name": name,
"age": age,
"response_obj": request.POST
}
return JsonResponse(json_data)
else:
return HttpResponse("这是一个其他类型的请求")
path('post_test1/',views.post_test1)
3、创建post请求,请求体为表单www-form-urlencoded
在postman中,表单选择 www-form-urlencoded 与 form-data 好像都可以
1、 RuntimeError: You called this URL via POST, but the URL doesn‘t end in a slash and you have APPEND_SLASH set. Django can’t redirect to the slash URL while maintaining POST data. Change your form to point to 127.0.0.1:8000/orders/post_test2/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings.
错误的url:http://127.0.0.1:8000/orders/post_test2
正确的url: http://127.0.0.1:8000/orders/post_test2/
1、表单www-form-urlencoded,用户传的表单key=value,value 都是文本,在获取传参时,使用
request.POST 就可以获取
2、form-data表单,value可以传文件。如果value是正常的文件,可以通过request.POST获取。
如果value是文件,则使用request.FILES获取。
2.3.2 POST请求 请求体为JSON
请求体为JSON或者XML,都属于非表单类型 Non-Form Data。
非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。
1、创建post 视图函数,通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。
def post_test2(request):
if request.method == 'POST':
# request.body 为<class 'bytes'>类型的json
request_json = request.body
# 将 bytes/str类型的json转成字典
request_dic = json.loads(request_json)
# 解析字典,取数据
name = request_dic.get("name")
age = request_dic.get("age")
return HttpResponse(f"我的名字是{name},今年{age}岁")
else:
return HttpResponse("这是一个其他类型的请求")
path('post_test2/',views.post_test2),
3、创建 post 请求体为json的请求
其他:
注意:
# 将 bytes/str类型的json转成字典
request_dic = json.loads(request_json)
注意,json的标准格式,里面的key 与value都是双引号。
如
{
"name": "wangwu",
"age": "35",
"response_obj": {
"name": "wangwu",
"age": "35"
}
}
如果客户端,在做json请求体时,写的是一个不标准的json,里面用的引号为单引号
{
'name': "wangwu",
"age": "35",
"response_obj": {
"name": "wangwu",
"age": "35"
}
}
在将json转成字典时,
request_dic = json.loads(request_json)
2.3.3 post传纯二进制文件 binary
post body 传binary 纯的二进制文件(只传文件)
三、请求头
3.1 request headers的写法
在写request headers时,可以使用-,不可以使用_
举个例子:
3.2 获取请求request headers的信息 两种方式
通过request.META 或request.headers获取。
3.2.1 方式一:通过request.headers获取(不常用)
格式:
request.headers 为字典,获取value值,可以使用request.headers[key] 或者 request.headers.get(key)
如,获取my-name
my-name的值为 request.headers[“my-name”]
3.2.2 方式二:通过request.META属性获取请求头headers中的数据
通过request.META属性获取请求头headers中的数据,request.META为字典类型。
注意:
1、request.META 中,将-转换成了_。如将my-name转换成HTTP_MY_NAME
2、request.META 中,将key全部转换成了大写,如将Authorization 转换成 HTTP_AUTHORIZATION
3、request.META 中,在key前,加了HTTP_前缀,如将Authorization 转换成 HTTP_AUTHORIZATION
举例:
获取headers中的my-name 与Authorization的值
request.META[‘HTTP_MY_NAME’]
request.META[‘HTTP_AUTHORIZATION’]
四、HttpResponse
格式:
HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
a.第一个参数(响应体)必须为字符串类型
b.content_type可以指定响应头中的Content-Type参数
c.status可以指定响应状态码
json_str = json.dumps(project_data, ensure_ascii=False)
return HttpResponse(f"<h1>获取项目{pk}信息</h1>")
return HttpResponse(json_str, content_type='application/json', status=201)
五、JsonResponse
HttpResponse的子类
JsonResponse用于返回json数据(用户端接收的数据)
若要返回json数据,可以使用JsonResponse来构造响应对象,作用:
- 帮助我们将数据转换为json字符串
- 设置响应头Content-Type为application/json
服务端在组装JsonResponse数据时,可以传入字典类型的数据,也可以传入嵌套字典的列表)
样式:
return JsonResponse(data, encoder=DjangoJSONEncoder, safe=True,
json_dumps_params=None, **kwargs):
举例:
return JsonResponse(project_data, json_dumps_params={'ensure_ascii': False}, status=201)
1、第一个参数(data)可以直接传递字典或者嵌套字典的列表
2、默认添加content_type为application/json
3、默认第一个参数只能为字典,如果为嵌套字典的列表,必须设置safe=False。关掉安全模式
1、字典类型的数据:
dict_data = {
'id': 1,
'name': 'xxxx项目',
'age': '18'
}
return JsonResponse(dict_data)
2、嵌套字典的列表:
dict_list = [
{
'id': 1,
'name': 'xxxx项目',
'age': '12'
},
{
'id': 2,
'name': 'yyyy项目',
'age': '33'
},
{
'id': 3,
'name': 'zzzz项目',
'age': '44'
}
]
return JsonResponse(project_data_list, safe=False)
六、视图类
使用视图类:
6.1 定义视图类
1、在views.py中,定义视图类。
2、必须继承View或者View子类
3、不同的请求方法有相应的方法进行对应。
GET -> get
POST -> post
PUT -> put
DELETE -> delete
PATCH -> patch
4、每一个处理请求的方法,必须得返回HttpResponse对象或者HttpResponse子类对象
5、每一个处理请求的方法,第二个参数必须为HttpRequest对象
class OrdersView(View):
# GET -> get 方法
def get(self,request,order_id):
order_data_dic = {
'id': order_id,
'name': '电脑',
'price': '500¥'
}
return JsonResponse(order_data_dic)
# POST -> post
def post(self,request,order_id):
return HttpResponse(f"{order_id}的post请求")
3.2 定义视图类的路由
样式:类视图.as_view()
path("getOrdersPost/",views.OrdersView.as_view()),
# path("getOrders/<int:order_id>/",views.OrdersView.as_view())
具体代码如下:
1、配置路由
2、定义视图类
class OrdersView(View):
# GET -> get 方法
def get(self,request):
print(request)
order_data_dic = {
'id': 1,
'name': '电脑',
'price': '500¥'
}
return JsonResponse(order_data_dic)
# POST -> post
def post(self,request):
return HttpResponse("post请求")
其他:
在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如
url(r'^',include('book.urls',namespace='book'))
命名空间表示,凡是book.urls中定义的路由,均属于namespace指明的book名下。
3.3 效果演示
postman get请求 视图类
http://127.0.0.1:8000/orders/getOrdersPost/
postman post请求 视图类
http://127.0.0.1:8000/orders/getOrdersPost/
原文地址:https://blog.csdn.net/qq_39208536/article/details/130663905
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_10489.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!