反向解析(视图函数)

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

上一篇博文中的反向解析主要围绕页面,此次主要围绕视图函数,因为一般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