1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Django的视图函数(二):request对象 视图函数返回值(HTML响应 JsonResponse)

Django的视图函数(二):request对象 视图函数返回值(HTML响应 JsonResponse)

时间:2021-02-19 00:17:44

相关推荐

Django的视图函数(二):request对象 视图函数返回值(HTML响应 JsonResponse)

文章目录

一.request对象1.概念2.属性(1)path(2)method(3)GET(4)POST(5)encoding(6)META 二.视图函数的返回值1.HTML响应(1)HttpResponse(2)render(3)HttpResponseRedirect 2.JsonResponse 三.反向解析(视图函数)1.基本使用2.位置参数3.关键字参数 四.HttpResponse子类

一.request对象

1.概念

Django框架根据Http请求报文自动生成的一个对象,包含了请求各种信息。

2.属性

创建主路由:

url(r'^req/',include('ReqApp.urls'))

(1)path

path:请求的完整路径

创建子路由:

url(r'^testReq/',views.testReq),

生成视图函数:

def testReq(request):print(request.path)return HttpResponse('testReq')

运行结果:

(2)method

GET 1.11版本最大参数的数据量2K,参数会显示在浏览器的地址栏上,不安全

POST 参数存在请求体中,文件上传等,相对安全

请求的方法,常用GET,POST

应用场景:前后端分离的底层、判断请求方式、执行对应的业务逻辑

def testReq(request):print(request.method)return HttpResponse('testReq')

(3)GET

视图函数:

def testReq(request):# 获取get请求方式的参数name = request.GET.get('name')age = request.GET.get('age')print(name,age)return HttpResponse('testReq')

使用postman工具来访问,运行结果:

思考:request.GET是什么类型???

print(request.GET) ------》<QueryDict: {‘name’: [‘zs’], ‘age’: [‘18’]}>

倘若又加一个参数,会怎么样?

取所有值:

def testReq(request):# print(request.path)print(request.GET)# name = request.GET.get('name')# age = request.GET.get('age')# print(name,age)name_list = request.GET.getlist('name')print(name_list)return HttpResponse('testReq')

运行结果:

总结:

QueryDict 类字典结构:key-value

一个key可以对应多个值

get 获取最后一个

getlist 获取多个

类似字典的参数,包含了get请求方式的所有参数

(4)POST

视图函数:

def testReq(request):print(request.POST)return HttpResponse('testReq')

输入post请求路径,并在postman中添加key-value的值

运行结果:

在执行post会遇到403 Forbidden这个问题,解决这个问题的方案有三种,这里讲下最简单的解决方案:

注释settings中的csrf中间件

再次运行,运行结果:

取值:

视图函数:

def testReq(request):print(request.POST)print(request.POST.get('name'))print(request.POST.getlist('name'))return HttpResponse('testReq')

运行结果:

POST:类似字典的参数,包含了post请求方式的所有参数

拓展:

1.QueryDict和Dict的区别?

dict是字典对象,没有urlencode()方法;

QueryDict对象,有urlencode()方法,作用是将QueryDict对象转换为url字符串;

eg:print(request.GET.urlencode())

一般QueryDict通过params = copy.deepcopy(request.GET)得到的,这时params是QueryDict对象;

也能params[key]=value进行添加数据

2.哪些请求方式会报错403?

get不需要,除了get都需要:post、put、patch、delete

(5)encoding

encoding:编码方式,常用utf-8

应用场景:

当你请求的时候,服务器响应之后有乱码问题,那么是因为你请求的时候没有指定编码格式

一般这种请求在python很少见,除非操作系统区别太大

这样可以在请求的时候设置请求的编码格式

request.encoding = 'utf-8'

这句话是设置请求头的编码格式

(6)META

应用场景:反爬虫,REMOTE_ADDR,拉入黑名单,展示客户端的所有信息及ip

例如获取主机地址:

def testReq(request):print(request.META.get('REMOTE_ADDR'))return HttpResponse('testReq')

查看META里都有什么:

def testReq(request):for m in request.META:print(m,request.META.get(m))return HttpResponse('testReq')

运行结果:

二.视图函数的返回值

当浏览器访问服务器的时候,那么服务器响应的数据类型有两种,分别是HTML响应和JsonResponse(前后端分离)

1.HTML响应

(1)HttpResponse

不使用模板,直接HttpResponse()

创建主路由:

url(r'^res/',include('ResApp.urls'))

创建子路由:

url(r'^testResponse/',views.testResponse),

生成视图函数:

def testResponse(request):response = HttpResponse()response.content ='英雄联盟'response.status_code = 404# 直接写出文本response.write('亚索')# 一次性读取剩余字节,冲刷缓存区response.flush()return response

运行结果:

(2)render

render方法的返回值类型也是一个HttpResponse

创建子路由:

url(r'^testRender/',views.testRender),

生成视图函数:

def testRender(request):return render(request,'testRender.html')

对render进行剪切一下,方便查看类型

def testRender(request):response = render(request,'testRender.html')print(type(response))return response

创建testRender.html模板:

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body>哈哈哈哈哈哈</body></html>

运行结果:

(3)HttpResponseRedirect

HttpResponseRedirect:重定向

其是HttpResponse的子类,响应重定向:可以实现服务器内部跳转

创建子路由:

url(r'^testRedirect/',views.testRedirect),

生成视图函数:

def testRedirect(request):# 重定向就是执行其他的视图函数return HttpResponseRedirect('/res/index/')

上面把路径写死了,为避免这种情况,我们也可以使用反向解析:

修改主路由:

url(r'^res/',include('ResApp.urls',namespace='res'))

修改子路由:

url(r'^index/',views.index,name='index'),

视图函数:

def testRedirect(request):return HttpResponseRedirect(reverse('res:index'))

运行结果:

查看HttpResponseRedirect类型:

def testRedirect(request):response = HttpResponseRedirect(reverse('res:index'))print(type(response))return response

运行结果:

说明:

方法的返回值类型是HttpResponseRedirect

HttpResponseRedirect继承了HttpResponseRedirectBase

HttpResponseRedirectBase继承了HttpResponse

状态码是302

重定向的简写方式:(常用)

创建子路由:

url(r'^testSimpleRedirect/',views.testSimpleRedirect),

生成视图函数:

def testSimpleRedirect(request):return redirect(reverse('res:index'))

运行结果:

拓展:

redirect方法是通过一个参数来确定是永久重定向还是普通的重定向

如果是永久重定向,那么类就是HttpResponsePermanentRedirect,状态码是301

如果是普通重定向,那么类就是HttpResponseRedirect,状态码是302

HttpResponsePermanentRedirect和HttpResponseRedirect分别继承HttpResponseRedirectBase

HttpResponseRedirectBase继承了HttpResponse

2.JsonResponse

django的视图函数,是不可以直接返回data的

JsonResponse 缺点:1.中文乱码 2.序列化

创建子路由:

url(r'^testJson/',views.testJson),

生成视图函数:

def testJson(request):data = {'msg': 'ok','status': 200,'name': '张三',}return JsonResponse(data=data)

运行结果:

我们会发现出现了中文乱码的问题。

解决中文乱码方案:

def testJson(request):data = {'msg': 'ok','status': 200,'name': '张三',}# 忽略编码return JsonResponse(data=data,json_dumps_params={'ensure_ascii':False})

运行结果:

序列化问题:

创建模型:

class Animal2(models.Model):name = models.CharField(max_length=32)class Meta:db_table = 'animal2'

添加数据:

视图函数:

def testJson(request):animal = Animal2.objects.first()data = {'msg': 'ok','status': 200,'name': '张三','animal':animal}return JsonResponse(data=data,json_dumps_params={'ensure_ascii':False})

运行结果:

django默认的视图函数,是不支持序列化的。

解决序列化方案:

在模型中定义一个方法:

class Animal2(models.Model):name = models.CharField(max_length=32)class Meta:db_table = 'animal2'# 当对象调用了to_dict方法之后,那么会返回一个字典def to_dict(self):return {'name':self.name}

在视图函数中调用这个方法:

def testJson(request):animal = Animal2.objects.first()data = {'msg': 'ok','status': 200,'name': '张三','animal':animal.to_dict()}return JsonResponse(data=data,json_dumps_params={'ensure_ascii':False})

运行结果:

若是想获取全部对象,可如下:

def testJson(request):# django默认的视图函数,是不支持序列化的,所以我们需要在后面使用django-rest-frameworkanimal_list = Animal2.objects.all()a_list=[]for animal in animal_list:a_list.append(animal.to_dict())data = {'msg': 'ok','status': 200,'name': '张三','animal_list':a_list}return JsonResponse(data=data,json_dumps_params={'ensure_ascii':False})

运行结果:

JsonResponse这个类是HttpRespon的子类,它主要和父类的区别在于:

1.它的默认Content-Type 被设置为: application/json

2.第一个参数,data应该是一个字典类型,当 safe 这个参数被设置为:False ,那data可以填入任何能被转换为JSON格式的对象,比如list, tuple, set。 默认的safe 参数是 True. 如果你传入的data数据类型不是字典类型,那么它就会抛出 TypeError的异常。

三.反向解析(视图函数)

上一篇博文中的反向解析主要围绕页面,此次主要围绕视图函数,因为一般python代码的反向解析都会结合重定向一起使用。

1.基本使用

形式:reverse(‘namespace:name’)

在上面,我们已经进行了反向解析的基本使用个,这里就不再说明了

2.位置参数

创建子路由:

url(r'^testLocation/',views.testLocation),url(r'^testReverseLocation/(\d{4})/(\d+)/(\d+)/',views.testReverseLocation,name='testReverseLocation'),

生成视图函数:

def testLocation(request):return redirect(reverse('res:testReverseLocation',args=[,7,29]))def testReverseLocation(request,year,month,day):return HttpResponse(year+'/'+month+'/'+day)

运行结果:

运行前:

运行后:

3.关键字参数

创建子路由:

url(r'^testKey/',views.testKey),url(r'^testReverseKey/(?P<year>\d{4})/(?P<month>\d+)/(?P<day>\d+)/',views.testReverseKey,name='testReverseKey')

生成视图函数:

def testKey(request):return redirect(reverse('res:testReverseKey',kwargs={'year':,'month':7,'day':29}))def testReverseKey(request,month,day,year):return HttpResponse(year + '-' + month + '-' + day)

运行结果:

运行前:

运行后:

四.HttpResponse子类

HttpResponse子类

HttpResponseRedirect

-302重定向,短暂性

HttpResponsePermanentRedirect

-301重定向,永久性

HttpResponseBadRequest

-400请求错误

HttpResponseNotFound

- 404路径错误

HttpResponseForbidden

- 403 csrf 防跨站攻击

HttpResponseNotAllowed

- 405请求方式不允许

HttpResponseServerError

- 500服务器错误

Http404- Exception

- raise 主动抛异常出来

Django的视图函数(二):request对象 视图函数返回值(HTML响应 JsonResponse) 反向解析(视图函数) HttpResponse子类

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。