无名,有名分组、反向解析;路由分发;JsonResponse对象;request对象的其他方法;CBV源码解析 # day53

2021/8/12 22:06:11

本文主要是介绍无名,有名分组、反向解析;路由分发;JsonResponse对象;request对象的其他方法;CBV源码解析 # day53,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

无名分组

在路由urls.py文件中

# \d => [0-9], 之后加上加好代表至少一个,一个到多个的意思
# url(r'^index/\d+', views.index)   #这种语法在index/之后最少也要加上一个数字才能查到返回值,不加数字查不到方法的返回值。
# url(r'^index/(\d+)', views.index),    #index/后面匹配的参数条件用小括号括起来,相应的在视图函数中的函数方法中必须多传一个形参,可以用来获取index/后面输入的值
def index(request, xxx):
    print(xxx)
    return HttpResponse("index")
# 无名分组就是将路由后面匹配的参数用小括号括起来,以位置参数的形式传递给视图函数

有名分组

# 给无名分组用?P<aaa>在括号内起了个aaa的名字,在此起的名字必须跟视图函数中所多传的形参名字一样
# url(r'^test/(?P<aaa>\d+)', views.test),
def index(request, aaa):
    print(aaa)
    return HttpResponse("index")
# 有名分组就是将路由后面匹配的参数用小括号括起来,以关键字参数的形式传递给视图函数

反向解析

# url(r'^test1/', views.home, name='xxx'), # 给路由起个别名
# 就是用一个方法得到一个结果,这个结果就是路由名对应的路径

无名分组反向解析

url(r'^test1/(\d+)', views.home, name='xxx'), # 给路由起个别名
# python中反向解析
def home(request):
    # 参数传递路由名称
    # reverse('xxx') => /test1/111
    # /test1/1
    # /test1/122222
    print(reverse('xxx',args=(122222, )))
    return HttpResponse('home')
# 前端解析
<a href="{% url 'xxx' 123 %}">1111111</a>

有名分组反向解析

url(r'^test2/(?P<year>\d+)', views.home, name='z'), # 给路由起个别名
# python中反向解析
def home(request):
    # 参数传递路由名称
    # reverse('xxx') => /test1/111
    # /test1/1
    # /test1/122222
    print(reverse('z',kwargs={'year':2021}))
    return HttpResponse('home')
# 前端解析
<a href="{% url 'xxx' 123 %}">1111111</a>

路由分发

# 总路由就不再写路由与视图函数的对应关系, 用来识别当前路由属于哪一个应用
​
from django.conf.urls import url,include   # 需要导入include模块
# 第一种方式
from  app01 import urls as app01_urls
from  app02 import urls as app02_urls
​
from app01 import views
urlpatterns = [
    url(r'app01/', include(app01_urls)),
    url(r'app02/', include(app02_urls)),
]
# 强调:总路由中,最后面千万不能加$
​
# 第二种方式
urlpatterns = [
    url(r'app01/', include('app01.urls')),
    url(r'app02/', include('app02.urls')),
]
​
​

JsonResponse对象

# json格式的数据有设么用?
    实现前后端数据交互的一种数据格式,实现跨语言之间的通信
from django.http import JsonResponse
​
import json
​
def a_json(request):
    user_dic = {'name': 'ly洋哥很帅', 'age': 18}
    l = [1, 2, 3,4]
    # res = json.dumps(user_dic, ensure_ascii=False)
    # res = JsonResponse(user_dic, json_dumps_params={'ensure_ascii': False})
    res = JsonResponse(l,safe=False)
    return HttpResponse(res)

request对象中的其他方法

request.method
request.GET.get()
request.GET.getlist()
request.POST.get()
request.POST.getlist()
​
def func(request):
    # 上传文件必须做的两件事:
    # 1. 请求方式改成post
    # 2. 改enctype=multipart/form-data
    # print(request.POST)
    # <MultiValueDict: {'myfile': [<InMemoryUploadedFile: 123.png (image/png)>]}>
    # print(request.FILES.get('myfile'))
​
    """
    /app01/func/
    /app01/func/
    /app01/func/
    
    /app01/func/
    /app01/func/
    /app01/func/?name=ly
    :param request:
    :return:
    """
    print(request.path)
    print(request.path_info)
    print(request.get_full_path())
    return render(request, 'func.html')

FBV与CBV的书写

FBV
    基于函数的视图
CBV
    基于类的视图
 
# 基本使用
from django.views import View
class MyView(View):
    def get(self,request):
        return HttpResponse("get方法")
    def post(self,request):
        return HttpResponse("post方法")
url(r'^func4',views.MyView.as_view())
"""为什么能够自动根据请求方法的不同执行不同的方法"""
1.突破口
    as_view()
2.CBV与FBV路由匹配本质
    url(r'^func4',views.MyView.as_view())
    # 等价  CBV路由配置本质跟FBV一样
    # url(r'^func4',views.view)
3.源码
        def as_view(cls, **initkwargs):
            def view(request, *args, **kwargs):
                self = cls(**initkwargs)  # self = MyView()  生成一个我们自己写的类的对象
                return self.dispatch(request, *args, **kwargs)
            return view
       def dispatch(self, request, *args, **kwargs):
        # 获取当前请求并判断是否属于正常的请求(8个)
        if request.method.lower() in self.http_method_names:
            # get请求  getattr(对象,'get')   handler = 我们自己写的get方法
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)  # 执行我们写的get方法并返回该方法的返回值

 



这篇关于无名,有名分组、反向解析;路由分发;JsonResponse对象;request对象的其他方法;CBV源码解析 # day53的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程