反向解析(视图函数)

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

上一篇博文中的反向解析主要围绕页面,此次主要围绕视图函数,因为一般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的异常。
posted @   布衣梦蝶1978  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示