首页 > 其他分享 >django框架——路由分发、名称空间、虚拟环境、视图层

django框架——路由分发、名称空间、虚拟环境、视图层

时间:2022-12-13 21:47:17浏览次数:49  
标签:index return request 视图 django 虚拟环境 路由 view

django框架——路由分发、名称空间、虚拟环境、视图层

一、路由分发

	django支持每个应用都有自己独立的路由层、静态文件、模板层,基于该特性,多人开发的项目就可以完全的解耦合,之后还可以利用路由分发整合在一起
    
    多个应用都有很多路由与视图函数的对应关系,这个时候可以拆分到各自的路由层中
    
    使用路由分发之前,总路由直接写路由与视图函数之间的关系
    	path('index/', index_func)
    使用路由分发之后,总路由只按照应用名分配匹配方向
    	path('app/', include('app.urls'))

二、名称空间

路由分发之后,针对相同的别名能不能自动反向解析出不同的
默认情况下是无法直接识别应用前缀的
 
如果想要正常识别区分有两种方式
	方式1:名称空间
 		总路由
  		path('app01/',include(('app01.urls','app01'),namespace='app01')),
    	path('app02/', include(('app02.urls', 'app02'), namespace='app02')),
    	反向解析
        reverse('app01:index_view')
        reverse('app02:index_view')
 	
	方式2:别名不冲突即可
     	多个应用别名不冲突可以用应用名作为别名的前缀
      	  path('index/', views.index, name='app01_index_view')
         path('index/', views.index, name='app02_index_view')

三、虚拟环境

项目1需要使用:django1.11 								 python38
项目2需要使用:django2.22 pymysql requests			      python38
项目3需要使用:django3.22 request_html flask urllib3		 python38
实际开发项目中我们只会给项目配备所需的环境,不需要的一概不配!!!

虚拟环境:能够针对相同版本的解释器创建多个分身 每个分身可以有自己独立的环境
    
pycharm创建虚拟环境:(每创建一个虚拟环境就相当于重新下载了一个全新的解释器)
命令行的方式: python -m venv pyvenv38
 
注意:python命令此处不支持多版本共存的操作 python27 python36 python38
    激活
        activate
    关闭
        deactivate

pip install --index-url http://mirrors.aliyun.com/pypi/simple/ django==1.11.11 --trusted-host mirrors.aliyun.com

四、视图层之必会三板斧

'''
用来处理请求的视图函数都必须返回HttpResponse对象
'''
class HttpResponse:
    pass
return HttpResponse()	

def render():
    return HttpResponse()
return render()

def redirect():
    redirect_class = 类(祖先有个类是HttpResponse)
    return redirect_class()
return redirect()

五、JsonResponse对象

from django.shortcuts import render, redirect, HttpResponse
from django.http import JsonResponse


# Create your views here.


def index_func(request):
    # return HttpResponse('嘻嘻嘻')
    # return render()
    # return redirect()
    # 给浏览器返回一个json格式的字符串
    user_dict = {'name': 'maria', 'age': 18}
    import json
    user_json = json.dumps(user_dict, ensure_ascii=False)
    # return HttpResponse(user_json)  # {"name": "maria", "age": 18}
    # return JsonResponse(user_dict)
ps:以后写代码很多时候可能需要参考源码及所学知识扩展功能
    class JsonResponse():
        def __init__(self,data,json_dumps_params=None):
            json.dumps(data,**json_dumps_params)
   
	JsonResponse主要序列化字典 针对非字典的其他可以被序列化的数据需要修改safe参数为False

六、视图层之request对象获取文件

form表单携带文件类型的数据需要做到以下几点
	1.method必须是post
 	2.enctype必须是multipart/form-data
django后端需要通过request.FILES获取文件类型的数据

七、视图层之FBV与CBV

FBV
	基于函数的视图
	def index(request):return HttpResponse对象
    简单讲,FBV就是在views.py文件中定义函数来处理用户请求,函数中再定义如果是GET请求怎么处理,POST请求怎么处理,等等

CBV
	基于类的视图
    BV是基于类的视图,就是使用了类来处理用户的请求,不同的请求我们可以在类中使用不同方法来处理,这样大大的提高了代码的可读性。CBV允许我们使用不同的实例方法来响应不同的HTTP请求方法,而不是像FBV那样使用条件分支代码。但是定义的类要继承父类View,所以我们在使用CBV的时候需要提前引入库:from django.views import View

	执行对应请求的方法前会优先执行 dispatch 方法(在get/post/put…方法前执行),dispatch() 方法会根据请求的不同调用相应的方法来处理。其实,在我们前面学到的知识都知道 Django 的 url 是将一个请求分配给可调用的函数的,而不是一个类,那是如何实现基于类的视图的呢? 主要还是通过父类 View 提供的一个静态方法 as_view() ,as_view 方法是基于类的外部接口, 他返回一个视图函数,调用后请求会传递给 dispatch 方法,dispatch 方法再根据不同请求来处理不同的方法。
	from django import views
  	 class MyLoginView(views.View):
        def get(self, request):
            return HttpResponse('from CBV get function')

        def post(self, request):
            return HttpResponse('from CBV post function')
	path('login/', views.MyLoginView.as_view())
	会自动根据请求方法的不同自动匹配对应的方法并执行

7.1 CBV源码剖析(import)

1.从CBV的路由匹配切入
	path('login/', views.MyLoginView.as_view())
        1.类名点名字(名字的查找问题)
        2.类名点名字并加括号调用(静态方法、绑定给类的方法)
2.函数名加括号执行优先级最高 项目一启动就会自动执行as_view方法
	path('login/', views.view)  # CBV路由本质还是FBV
3.浏览器地址栏访问login路由需要执行view函数
	1.产生我们自己编写类的对象
 	2.对象调用dispatch方法(注意查找顺序)
4.研究父类中的dispatch方法
	获取当前请求方法并转小写 之后利用反射获取类中对应的方法并执行
  

class View:
     @classmethod
     def as_view(cls, **initkwargs):
        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            return self.dispatch(request, *args, **kwargs)
     def dispatch(self, request, *args, **kwargs):
         handler = getattr(self, request.method.lower())
         return handler(request, *args, **kwargs)

八、模板层

"""
{{}}:主要与数据值相关
{%%}:主要与逻辑相关

django的模板语法是自己写的 跟jinja2不一样

1.针对需要加括号调用的名字 django模板语法会自动加括号调用你只需要写名字就行
2.模板语法的注释前端浏览器是无法查看的 {##}
3.
"""

1.模板语法传值
    return render(request, 'demo02.html', {'n1': name, 'a1': age})  # 传值方式1:精准传值 不浪费资源 针对多资源的传递书写麻烦
    return render(request,'demo02.html', locals())  # 传值方式2:将函数名称空间中所有的名字全部传递 名字过多并且不使用的情况下比较浪费资源

2.模板语法传值特性
    1.基本数据类型正常展示
    2.文件对象也可以展示并调用方法
    3.函数名会自动加括号执行并将返回值展示到页面上(不支持额外传参)
    4.类名也会自动加括号调用
    5.对象则不会	
	 ps:总结针对可以加括号调用的名字模板语法都会自动加括号调用
            
3.模板语法之过滤器(内置函数)
	

标签:index,return,request,视图,django,虚拟环境,路由,view
From: https://www.cnblogs.com/HaiMan/p/16980710.html

相关文章