今日内容详细
路由分发
| djanogo支持每个应用都可以有自己独立的路由层、静态文件、模板层。基于该特性多人开发项目就可以完全解耦合, 之后利用路由分发还可以整合到一起 |
| |
| 多个应用都有很多路由与视图函数的对应关系 这个时候可以拆分到各自的路由层中 |
| |
| 使用路由分发之前 总路由直接干路由与视图函数的匹配 |
| path('index/',index) |
| 使用路由分发之后 总路由只按照应用名分配匹配方向 |
| path('app01/', include('app01.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.http import JsonResponse |
| def index_func(request): |
| |
| user_dict = {'name':'jason老师','age':18} |
| import json |
| user_json = json.dumps(user_dict,ensure_ascii=False) |
| return HttpResponse(user_json) |
| |
| |
| 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" |
| |
| if request.method == 'POST': |
| |
| |
| file_obj = request.FILES.get('file') |
| print(file_obj.name) |
| with open(r'%s' % file_obj.name, 'wb') as f: |
| for line in file_obj: |
| f.write(line) |
| return render(request, 'indexPage.html') |
视图层之FBV与CBV
| FBV |
| 基于函数的视图 |
| def index(request):return HttpResponse对象 |
| |
| CBV |
| 基于类的视图 |
| 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 fucntion') |
| path('login/',views.MyLoginView.as_view()) |
| 会自动根据请求方法的不同自动匹配对应的方法并执行 |
CBV源码剖析(重要)
| 1.从CBV的路由匹配切入 |
| path('login/',views.MyLoginView.as_view()) |
| 1.类名点名字(名字的查找问题) |
| 2.类店名字并加括号调用(静态方法 、绑定给类的方法) |
| 2. 函数名加括号执行优先级最高 项目一启动就会自动执行as_view方法 |
| path('login/'.views.view) |
| 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.模板语法的注释前端浏览器是无法查看的 {##} |
| """ |
| |
| 1.模板语法传值 |
| return render(request,'demo02.html',{'n1':name, 'a1':age}) |
| return render(request,'demo02.html',locals()) |
| |
| |
| 2.模板语法传值特性 |
| 1.基本数据类型正常展示 |
| 2.文件对象也可以展示并调用方法 |
| 3.函数名加自动加括号执行并将返回值展示到页面上(不支持额外传参) |
| 4.类名也会自动加括号调用 |
| 5.对象则不会 |
| ps:总结针对可以加括号调用的名字模板语法都会自动加括号调用 |
| |
| 3.模板语法之过滤器(内置函数) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构