目录
web框架
1.定义:是一种开发框架 用来支持动态网站、网络应用程序及网络服务的开发(专门为web服务器处理动态资源请求的应用程序)
注:web服务器:一般指网站服务器 驻留与因特网上某种类型计算机的程序
web服务器只能处理静态资源 web服务器通过WSGI协议把动态资源交给web框架操作 读取空模板与数据库数据查找整合成一个完成网页 通过WSGI协议返回服务器
2.种类:基于请求
基于组件
编写web框架模块
1.socket模块
代码重复操作
2.wsgiref模块:对socket模块重复代码进行封装
请求方式数据获取采用函数进行封装
获取网址后缀方式采用路由匹配(网址后缀名,函数名) 网址后缀名一旦匹配上就执行后面的函数
动静态网页
1.静态网页:网页数据是直接固定的 不会依赖别的数据的改变而改变 更改只能修改源代码
2.动态网页:网页数据不是直接固定写好的 数据动态来源于动态获取(后端传入) 后端数据修改 则页面数据更改
jinjia2模块
1.定义:能够在html文件中使用类似于后端的语法操作各种数据类型(第三方模块)
2.功能:
HTML加载
1、在main文件同级目录创建templates目录
2、在目录当中编写HTML文件
3、导入render_template方法
4、使用render_template方法加载HTML文件
5、将加载的内容返回
HTML数据渲染:把python视图函数当中的数据传递到HTML上
{{}} 变量
{%%} 标签(end)
{{|}} 过滤器
python主流web框架
1.django框架
2.flask框架
3.tornado框架
4.fastapi框架
5.sanic框架
django框架
版本
1.x同步
2.x同步
3.x异步
下载安装
1.下载安装:pip install django==版本
2.验证是否下载成功:cmd终端操作django-admin
操作
1.启动注意事项:
计算机名称尽量不要使用中文
项目中的py文件名不要使用中文
不同版本的django框架与不同版本的python解释器配合可能会出现报错
一个pycharm窗口只允许有一个项目
2.在命令行执行项目启动操作:
2.1 创建项目:django-admin startproject 项目名
2.2 启动django项目:切换项目 cd 项目名
启动目录:python manage.py runserver ip:port
2.3 创建app应用:
3.pycharm执行项目启动操作:鼠标点
目录结构
1.目录
同名文件夹:
__init__ 冷门配置
settings.py 配置文件
urls.py 路由匹配
wsgi.py django服务
manage.py 入口文件
python manage.py runserver ip:port
templates文件夹 储存html文件夹
应用名文件夹:
db.sqlite3 django自带小型数据库
__init__ 冷门配置
admin.py django自带的后台管理
apps.py 用于应用注册
models.py 存储与数据库表相关的类
tests.py 自带测试文件
views.py 逻辑代码(视图层)
migrations文件夹 orm相关(与数据库打交道)
python manage.py makemigrations
python mansge.py migreat
2.层
urls.py 路由层
views.py 视图层
templates文件夹 模板层
models.py 模型层
三板斧
1.HttpResponse 返回字符串数据
2.render 返回html页面 支持模板语法
3.redirect 重定项
静态文件操作
1.存储:static文件夹
2.种类:html页面上不经常改变的文件、css、js、第三方框架文件、图片文件
3.访问:在settings配置文件中添加static文件夹路径
4.接口前缀动态改变:
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-distt/css/bootstrap.min.css' %}" >
form表单
1.请求类型:
get:form表单默认请求 向别人索要数据 可以携带一些不重要数据(没有请求体) 数据大小2KB~4KB左右
post:向别人提交数据 可以携带数据(请求体)
2.修改数据请求:form表单method="post"
注需要注释settings配置文件夹中的代码:
MIDDLEWARE = [# 'django.middleware.csrf.CsrfViewMiddleware',]
request对象方法
1.request.mothod 获取请求类型
2.request.GET 获得get请求发送的字典数据(对象)
3.request.GET.get() 获取get请求中的最后一个数据
4.request.GET.getlist() 获取整个get请求整个列表
5.request.POST 获得post请求发送的字典数据(对象)
6.request.POST.post() 获取post请求中的最后一个数据
7.request.POST.postlist() 获取整个get请求整个列表
MySQL数据库连接
1.pycharm连接MySQL数据库:通过databases库 第一次需要下载插件及对应驱动
pycharm可以操作简单的数据的增删改查
2.django连接MySQL数据库:
配置文件中配置MySQL数据库基本数据(库名、ip、端口、用户名、密码、编码)
下载连接mysql的第三方模块:mysqlclient
ORM
1.定义:对象关系映射
类 表
对象 记录
对象属性 值
2.ORM语法操作:models.py文件下编写
3.数据库的迁移/同步操作
python manage.py makemigrations
python manage.py migrate
4.表的主键在orm可以不写 orm会自动创建一个id主键
数据库操作
1.增:mondels.Info.object.create(字段) == create table info(字段)
2.改:mondels.Info.object.filter(筛选) update(新值) == update 表名 set 字段名=新数据 where 筛选条件
3.删:models.Info.object.filter(筛选) delete == del from 表名 where 筛选条件
4.查:models.Info.object.filter() == select 字段1,字段2 from 表名;
生命周期流程图
路由层
路由匹配
1.操作文件:urls.py
2.路由匹配:(网址后缀名,函数名)
网址后缀名一旦匹配上就执行后面的函数
3.访问时网址后缀/可以不写:django会做二次匹配(第二次加/)
4.转换器:网址后缀名后面还有确定数据类型的数据时 可以使用转换器类型进行数据的匹配
转换器匹配到的内容会当做视图函数的关键字参数 转换器与视图函数参数要一一对应
5.匹配类型:
5.1 路由匹配:
path('func/<int:year>/<str:info>/',views.func)
def func(request,year,info):
pass
5.2 正则匹配:
re_path('^text/$',views.text)
5.2.1 有名分组(正则起名?P): re_path('^text/(?P<year>\d+)/(?P<other>.*?)/',views.text)
5.2.2 无名分组:re_path('^text/(\d+)/(.*?)/',views.text)
注:django1.11只支持正则匹配 url()
django2、3、4中path() re_path() == url()
反向解析
1.原因:当网址后缀名在路由中写死后 已在html页面应用 当在路由匹配中做修改的话 html对应的数据会失效 若需要修改只能一条一条修改 因此可以使用反向解析操作
2.定义:返回一个结果 该结果可以访问到对应的路由(在路由匹配时对网址后缀名起别名)
3.语法:
html页面:
{% url 'reg_view' %}
后端:
from django.shortcuts import reverse
reverse('reg_view')
注:反向解析不同转换器方法一样(path()、re_path()、ulr())
4.有名无名反向解析:当网址后缀后面还有不确定的数据时
有名转换器:
path('reg/<str:info>/', views.reg, name='reg_view')
reverse('reg_view', args=('lili',))
{% url 'reg_view' 'lili' %}
无名转换器:
注:有名无名反向解析不同转换器方法一样(path()、re_path()、ulr())
路由分发
1.原因:总路由及静态文件与templates文件夹负责django中所有应用的的数据的话 整体数据比较混乱且数据量大 因此django中的应用可以有自己独立的urls.py templates文件夹 static文件夹
2.优点:能够让基于django开发的多个应用完全独立 便于小组开发
3.总路由:
path('app01/',include('app01.urls')).
path('app02/',include('app02.urls'))
子路由:
path('after/',views.after) # app01
path('after/',views.after) # app02
注:当项目特别大时 可以使用路由分发
名称空间
1.原因:有路由分发场景下多个应用在涉及到反向解析别名冲突的时候无法正常解析
2.解决方式:
方式一:名称空间 namespace
path('app01/', include(('app01.urls', app01),namespance='app01'))
path('app02/', include(('app02.urls', app01),namespance='app02'))
方式二:别名不冲突(在别名前加应用名)
网页伪静态
1.原因:提升网页被搜索及展示的概率
2.定义:欺骗浏览器认为该网页是静态网页 数据不经常改变 使浏览器收录该网页
3.操作:将网址后缀名以文件的后缀名展示
视图层
视图函数返回值
1.返回值类型:HttpResponse对象
2.三板斧返回均为HttpResponse对象
rander返回的是HttpResponce对象:return HttpResponse(content, content_type, status)
redirect返回是HttpResponse对象:redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
return redirect_class(resolve_url(to, *args, **kwargs))
HttpResponse是一个类: class HttpResponse(HttpResponseBase):
序列化
1.分类:
json方法:
(ensure_ascii=False)
import json
def mylist(request):
info = {'name': 'lili童鞋', 'age': 22}
# l1 = json.dumps(info) # {"name": "lili\u7ae5\u978b", "age": 22}
l1 = json.dumps(info, ensure_ascii=False) # {"name": "lili童鞋", "age": 22}
return HttpResponse(l1)
ResponseJson方法:
if json_dumps_params is None:
json_dumps_params = {}
kwargs.setdefault('content_type', 'application/json')
data = json.dumps(data, cls=encoder, **json_dumps_params)
super().__init__(content=data, **kwargs)
1.2.1 使用JsonResponse方法存在汉字会乱码 可以通过json_dumps_params = {}给它传递实参来解决乱码问题
from django.http import JsonResponse
def mylist(request):
info = {'name': 'lili童鞋', 'age': 23}
# l1 = JsonResponse(info) # {"name": "lili\u7ae5\u978b", "age": 23}
l1 = JsonResponse(info, json_dumps_params={'ensure_ascii': False}) # {"name": "lili童鞋", "age": 23}
return HttpResponse(l1)
1.2.2 当序列化的不是字典类型的数据时报错:In order to allow non-dict objects to be serialized set the safe parameter to False.
需要确认传递的数据是否安全 防止产生错误 导致系统崩溃(如弹框)
def mylist(request):
info = [1, 3, 5]
# l1 = JsonResponse(info) # {"name": "lili\u7ae5\u978b", "age": 23}
l1 = JsonResponse(info, json_dumps_params={'ensure_ascii': False}, safe=False) # [1, 3, 5]
return HttpResponse(l1)
form表单操作
1.携带文件数据具备条件:
请求类型必须是method="post"
multipart/form-data
后端:request.FILES
FBV与CBV
1.FBV:基于函数的视图
path('func/',views.view)
2.CBV:基于类的视图
2.1 CBV源码分析:
path('User/',views.User.as_view())
User.as_view() 类中的方法as_view 我们写的类中没有 查找父类View中的as_view方法
父类View中的as_view方法返回值view
path('User/',views.view)
执行view方法返回dispatch方法
返回请求类型的小写
执行请求类型的方法
模板层
模板语法
传值
1.传值方式:
指明道姓:适用于少量传值
return render(request, 'func.html', {'name': name})
关键字locals():适用局部名称数据一次传入
return render(request, 'func.html', locals())
过滤器
1.定义:类似于python内置函数
符号
1.使用数据:{{}}
2.使用方法:{%%}
标签
1.定义:类似于python中的流程控制
自定义功能
1.前提:
在应用下创建templatetags文件夹
创建py文件
编写代码:from django.template import Library
register = Library()
2.类型:
自定义过滤器:
自定义标签
自定义inclusion_tag
模板继承
1.原因:减少代码编写 一个html页面的样式需要在多个页面使用 采用模板继承的方式
2.更改部分数据:
模板页面操作:用block进行包裹 之后在继承页面可以对该部分进行修改 一个页面至少应该有三处
{% extends 'html文件名' %}
{% block 名字 %}
模板内容
{% endblock %}
继承页面操作:
css content js
{% block css %}
{% endblock %}
{% block content %}
{% endblock %}
{% block js %}
{% endblock %}
注:子板中还可以使用母板的内容 {{ block.super }}
模板导入
1.使用:将html页面的某个部分当做模块的形式导入使用
{% include 'func.html' %}
标签:web,框架,py,request,django,path,数据,路由
From: https://www.cnblogs.com/040714zq/p/16655187.html