反向解析(视图函数)
三.反向解析(视图函数)
上一篇博文中的反向解析主要围绕页面,此次主要围绕视图函数,因为一般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的异常。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!