反向解析(视图函数)
三.反向解析(视图函数)
上一篇博文中的反向解析主要围绕页面,此次主要围绕视图函数,因为一般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=[2020,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":2020,"month":7,"day":29}))
def testReverseKey(request,month,day,year):
return HttpResponse(year + "-" + month + "-" + day)
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-framework
animal_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的异常。
原文地址:https://www.cnblogs.com/mengdie1978/p/17436218.html