今日内容详细
路由分发
django的每一个应用都可以有自己独立的路由层(urls.py)静态文件(static文件夹)模板层(templates文件夹)
基于这个特性多人开发项目就可以完全解耦和 之后利用路由器分发还可以整合在一起
-
路由器分发解决的就是项目的总路由匹配过多的情况
-
利用路由分发的特性之后 总路由不再干路由与视图函数的直接对应关系
-
总路由做分发处理 识别当前urls是属于哪个app下的 直接分发到对应的应用去处理
-
请求来了之后 总路由不做对应关系 只询问你要访问哪个app的功能 然后将请求转发给对应的app去处理
总路由分发配置
1.在app目录下创建一个urls.py文件 2.导入一个include模块(主路由 子路由) 主路由: from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), #路由分发 path('app01/',include('app01.urls')), #只要是app01的 全部交给app01处理 path('app02/',include('app02.urls')) #只要是app02的 全部交给app02处理 ] 子路由正常写 路由与函数视图对应关系 ''' 在访问的时候要指定是找哪一个app '''
名称空间
路由分发之后 针对相同的别名能不能正确解析出不同的应用前缀
默认情况下不行
方式一:名称空间
总路由:path('app01/',include('app01.urls','app01'),namespace='app01'),
path('app02/',include('app02.urls','app02'),namespace='app02')
反向解析:
reverse('app01:index_view')
reverse('app02:index_view')
方式二:别名不冲突即可
多个应用别名不冲突可以用应用名作为别名的前缀
path('index/',views.index_func,name='app_01index_view')
path('index/',views.index_func,name='app_02index_view')
虚拟环境
当不同的项目需要使用不同版本的模块时 我们需要用到不同的模块 浪费空间 有些还需要卸载 很麻烦
虚拟环境和本地环境互不打扰 想用什么模块直接下载
虚拟环境:能够针对相同版本的解释器创建多个分身 每个分身可以有自己独立的环境
pycharm创建
每创建一个虚拟环境就相当于重新下载了一个全新的解释器
创建好的虚拟环境:
命令行创建
python -m venv pyvebne38
注意:python命令此处不支持多版本共存操作 python27 python36 python38
用命令行创建的时候 要将要使用的python解释器放到最上面
创建好了以后 将虚拟环境激活
要先cd到创建好的目录中的scripts文件下
执行激活命令:
activate
关闭指令:
deactivate
视图层之必会三板斧
用来处理请求的视图函数都必须返回HttpResponse对象
class HttpResponse:
pass
return HttpResponse()
'''返回的是HttpResponse加括号产生的对象'''
def render():
return HttpResponse()
return render()
'''返回的是HttpResponse加括号产生的对象'''
def redirect():
redirect_class = 类(祖先有个类是HttpResponse)
return redirect_class()
return redirect()
'''返回的是HttpResponse加括号产生的对象 '''
permanent=False 执行HttpResponseRedirect
HttpResponseRedirect继承了HttpResponseRedirectBase
HttpResponseRedirectBase继承了HttpResponse
JsonResponse对象
import json
def func(request):
user_dict = {'name':'jason'老师}
#user_json=json.dumps(user_dict)
#return HttpResponse(user_json)
return JsonResponse(user_dict)
ps:写代码的时候多参考源码及所学知识扩展功能
字符编码问题
return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
视图层之request对象获取文件
form表单携带文件类型的数据需要做到以下几点
1.method='POST'
2.enctype必须是multipart/form-data
django后端需要通过request.LILES获取文件类型的数据
视图层之FBV与CBV
FBV
基于函数的视图
CBV
基于类的视图
class Myview(views.View):
def get(self,request):
return HttpResponse('get')
def post(self,request):
return HttpResponse('post')
基于类的路由层
path('class/',views.Myview.as_view())
会根据请求方法的不同自动匹配对应的方法并执行
CBV源码剖析(*)
1.从CBV的路由匹配切入
path('class/',views.Myview.as_view())
1.类名点名字(名字查找问题 先从对象自身找 然后去产生对象的类 再去父类)
2.类名点名字病假括号调用(静态方法、绑定给类的方法)
2.函数名加括号执行优先级最高 项目已启动就会自动执行as_view方法
path('class/',views.Myview.as_view())
变成
path('class/',views.view)
'''CBV路由本质还是FBV'''
3.浏览器地址栏访问class路由需要执行的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)
模板层
1.模板语法的传值
传值方式1:
精准传值 不浪费资源 针对资源多的传递书写麻烦
{{'n1'=name,'n2'=age}}
传值方式2:
将函数名称空间中的所有名字全部传递 浪费资源
locals()将当前试图上的所有名字直接传给页面
2.模板语法传质特性
1.基本数据类型正常展示
2.文件对象也可以展示并调用方法
3.函数名会自动加括号执行并将返回值展示到页面上(不支持额外传参)
4.类名也会自动加括号调用
5.对象则不会
ps:总结针对可以加括号调用的名字模板语法都会自动加括号调用
3.模板语法之过滤器(内置函数)
{{i|add:1}} i数值自增1
{{s|add:'dig'}} s字符串拼接
{{l|length}} l列表统计长度
{{s|slice:'1:4'}} 索引1切到4
{{ file_size|filesizeformat } 将文件大小转换成合适的格式
{{ ctime|date:'Y-m-d H:i:s ' }} 日期格式 x不能用
{{ s|truncatechars:5 }} 节选字符 后面的参数设置为挤 就会显示鸡哥字符 剩余部分用...表示
{{ s|truncatewords:3 }} 类似truncatechars,参数设置为几,就会显示单词,剩余部分用三个点表示
h1 = '<h1>哈哈哈哈</h1>'
s1 = "<script>confirm(123)</script>"
<p>{{ h1|safe }}</p>
<p>{{ s1|safe }}</p>
对变量内的字符串进行html转义(默认情况下是不转义)
标签:return,三板斧,视图,虚拟环境,HttpResponse,path,路由,view
From: https://www.cnblogs.com/lzy199911/p/16980871.html