首页 > 其他分享 >Djangoday之试图层和模板层

Djangoday之试图层和模板层

时间:2022-12-13 19:33:32浏览次数:48  
标签:index 试图 return request 视图 模板 Djangoday 路由

目录

Django之视图层及模板层

一、路由分发

django支持每个应用都可以有自己独立的路由层、静态文件、模板层。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起
    
多个应用都有很多路由与视图函数的对应关系这个时候可以拆分到各自的路由层中

使用路由分发之前总路由直接干路由与视图函数的匹配
path('index/', index)
使用路由分发之后总路由只按照应用名分配匹配方向
path('app01/', include('app01.urls' ))

二、名称空间

路由分发之后针对相同的别名能否自动反向解析出不同的应用前缀
默认情况下是无法直接识别应用前缀的 想要正常识别区分有两种方式
方式1:名称空间
总路由
path(' app01/', include((' app01.ur1s', ' 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')

三、虚拟环境

问题引入
项印需要使用:django1.11                              python38
项目2需要使用:django2.22 pymysq1 requests            python38
项目3需要使用:django3.22 request_html flask ur1lib3  python38

实际开发项目中我们只会给项目配备所需的环境。不需要的一概不配! ! !

虚拟环境:能够针对相同版本的解释器创建多个分身 每个分身可以有自己独立的环境

pycharm创建虚拟环境:(每创建一个虚拟环境就相当于重新下裁了一个全新的解释器)
用命令行创建虚拟环境:python -m venv 虚拟环境名字
激活 activate/关闭 deactivate

image

四、试图层之必会三板斧

这句话完全正确>>>'用来处理请求的视图都必须返回HttpResponse对象'

class HttpResponse:
    pass
return HttpResponse()

def renser():
    return HttpResponse()
return reder()

def redirect():
    redirect_class = 类(祖先有个类是HttpResponse)
    return redirent_class
return redirect()
三元表达式是:表示三元运算符需要三个操作数。三元运算符是软件编程中的一个固定格式,语法是“条件表达式?表达式1:表达式2”。使用这个算法可以使调用数据时逐级筛选。

举个简单例子:
HttpResponsePermanentRedirect if permanent else HttpResponseRedirect  # 三元运算表达式
int a=1;int b=2;int c= a>b?1:0,结果c 为0。a>b 为条件,后面当条件为true时返回":"前面的结果,反之返回":"后面的结果。

语法为:条件表达式?表达式1:表达式2。 

说明:问号前面的位置是判断的条件,判断结果为bool型,为true时调用表达式1,为false时调用表达式2。

其逻辑为:“如果条件表达式成立或者满足则执行表达式1,否则执行第二个。”常用在设置默认值,例如某个值不一定存在,则判断这个值是否存在,不存在给默认值(表达式2)。

五、视图层之JsonRespnse对象

from django.http import JsonResponse
import json

def index_func(request):
    user_dict = {'name':'almira','age':24}  
    return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False},)


# json_dumps_params={'ensure_ascii':False}  # 这句代码解决了中文乱码的情况
from django.http import JsonResponse
import json

def index_func(request):
    user_list = [11,22,33,44] 
    return JsonResponse(user_list,json_dumps_params={'ensure_ascii':False},safe=False)

# safe=False  # JsonResponse主要序列化字典 针对非字典的其他可以被序列化的数据需要修改safe参数为False
原理是以下源代码
class JsonResponse():
        def __init__(self,data,json_dumps_params=None):
        		json.dumps(data,**json_dumps_params)

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

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

七、视图层之FBV与CBV

FBV (Function Based Views,基于函数的视图)
def index(request):
    return HttpRespnse对象

CBV(Class Based Views,基于类的视图)
from django import views
class MyLoginView(view.View):
    def get(self,request):
        return HttpRseponse('from CBV get function')
    
    def post(self,request):
        return HttpResponse('from CBV post function')
path('login/',views.MyLoginViews.as_view())

# 会自动根据请求方法的不同自动配对对应的方法并执行

八、CBV源码剖析

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,视图,模板,Djangoday,路由
From: https://www.cnblogs.com/almira998/p/16979684.html

相关文章

  • 路由分发 路由别名的名称空间 虚拟环境 HTTPresponse JsonResponse request对象获取
    目录路由分发路由别名冲突反向解析失败方式一:名称空间include方式二:别名不冲突即可虚拟环境python-mvenvvenv_name视图层之必会三板斧HTTPresponseJsonResponse对象......
  • django路由分发、名称空间、虚拟环境、视图层之FBV与CBV及模板层
    目录路由分发名称空间虚拟环境视图层之必会三板斧JsonResponse对象视图层之request对象获取文件视图层之FBV与CBVCBV源码剖析(重点)模板层null路由分发django支持每个应用......
  • PHP 替换WORD模板 实现可直接打印的WORD
    有一款非常好用的开源东东:PHPWORD只要类似这样的语句,就能实现模板文件中的替换:$document->setValue('Value1',iconv('utf-8','GB2312//IGNORE','高尔夫1.6L舒适'));$doc......
  • 四种二分查找法模板
    publicclassBinarySearch{publicstaticvoidmain(String[]args){int[]arr={1,2,3,3,3,4,5,5,7};intupper1=floor_lower(arr,3);......
  • P3378 【模板】堆
    P3378【模板】堆题目简述给定三个操作,求数列中最小的数,删除数列中最小的数,插入一个新的数思路板子题没什么好说,用stl自带的优先队列很好写,但手写的也要掌握。建议......
  • P3865 【模板】ST 表
    P3865【模板】ST表题目简述对于给定的数列,要求以\(\theta(1)\)的时间复杂度计算出\([l_i,r_i]\)中最大值思路没什么可讲的,但要注意,计算区间长度的对数要是log2(r-l......
  • P5905 【模板】Johnson 全源最短路
    P5905【模板】Johnson全源最短路...处理负权边的方法十分巧妙,就像是势能一样算法上文链接有详解,就不赘述了,这样就实现了dij也可以处理负边是需要提前预处理一遍,建立......
  • 数据模板 DataTemplate
    <Grid><ListBoxx:Name="list"><ListBox.ItemTemplate><DataTemplate><StackPanelOrientation="Horizont......
  • cmakelist 基础模板
    一个最基础的cmake模板#cmakeneedsthislinecmake_minimum_required(VERSION3.1)#Defineprojectnameproject(opencv_example_project)find_package(OpenCV......
  • Unity 自定义创建脚本模板
    Unity自定义创建脚本模板原理:以模板代码为底板,通过关键字替换来实现代码创建两种实现方案方案11.先准备好对应的代码模板,放到Assets\ScriptTemplates目录下usingSys......