web框架理解
- 1.wed框架的简单理解
基于互联网的wed服务端(socket服务端) - 2.web框架的一些知识
1.socket服务端代码 2.HTTP协议 >>>:四大特性 - 3.根据路由的不同请求不同的内容
路由:web开发中路由指的是根据url分配到对应的处理程序。 - 4.请求方式
get 朝服务端索要数据 post 朝服务端提交数据 - 5.从请求数据中筛选出用户输入的路由
target_url = data.decode('utf8').split(' ')[1]
基于wsgiref模块解决wed推导的缺陷
-
1.wsgiref模块介绍
wsgiref模块内部封装了socket代码与对请求数据的处理 -
2.如何解决socket代码重复编写
- 导入wsdiref模块
from wsgiref.simple_server import make_server -
3.针对请求数据格式的处理复杂且重复
将其封装为函数功能 -
4.软件开发目录规范分类管理
- 根据py文件中功能的不同划分到不同的py文件(模块化)
urls.py 对应关系 views.py 功能函数 start.py 启动文件 templates文件夹 存储html -
动静态网页
- 1.动态网页
- 页面上的数据是动态获取的,也就是通过后端传入,例如用户注册登录账户密码的获取
- 2.静态网页
- 直接写死的数据,修改源码才能修改数据,前端所写的页面展示出来的就是静态网页
- 1.动态网页
jinja2模块
jinja2的下载 pip38 install jinja2
导入jinja2模块 from jinja2 import Template
jinja2模板语法
前端操作后端,前端语法模板
1.字典取值(四种方式)
<h1>{{ data }}</h1>
<h1>{{ data['name'] }}</h1>
<h1>{{ data.get('pwd') }}</h1>
<h1>{{ data.hobby }}</h1>
2.数据库表单展示
{% for user in user_data %}
<tr>
<td>{{ user.id }}</td>
<td>{{ user.name }}</td>
<td>{{ user.age }}</td>
</tr>
{% endfor %}
python框架介绍
1.django框架 大而全 自身携带的功能非常的多
"""
django框架介绍: 版本问题
1.X:同步 1.11
2.X:同步 2.2
3.X:异步 3.2
启动注意事项
1.计算机名称尽量不要有中文
2.项目中所有的py文件名尽量不要用中文
3.不同版本的python解释器配合不同版本的django,会有一些报错
4.一个pycharm窗口只允许有一个项目 不要做项目的嵌套
"""
2.flask框架 小而精,自身携带的功能非常的少,依赖于第三方模块
3.tornado框架 异步非阻塞框架 该框架快到可以作为游戏服务器
4.fastapi框架、sanic框架、... 最近流行的
django基本操作
- 1.验证django是否下载成功
cmd终端输入 django-admin
2.cmd命令操作
1.创建django项目
django-admin startproject 项目名
2.启动django项目
1.先切换到项目目录下 cd 项目名
2.执行启动目录 python38 manage.py runserver ip:port
# ip:port 本机可不写
3.访问django服务端
浏览器直接访问
4.创建app应用
python38 manage.py startapp 应用名
5.templates文件夹的配置
'DIRS': [os.path.join(BASE_DIR, 'templates')]
django目录文件介绍
1. 项目同名文件夹
2. __init__.py 很少用 主要做一些冷门配置
3. settings.py 项目配置文件
4. urls.py 对应关系(目前简单的理解:网址后缀跟函数名)
5. wsgi.py django服务 基本不用
6. manage.py django入口文件
7. templates文件夹 存储项目所需的html文件
8. 应用名文件夹(可以有多个)
9. migrations文件夹 orm相关(数据库打交道的记录)
10.__init__.py 很少用主要做一些冷门配置
11.admin.py django自带的后台管理
12.apps.py 创建应用之后用于应用的注册
13.models.py 存储与数据库表相关的类
14.tests.py 自带的测试文件
15.views.py 存储业务相关的逻辑代码(函数、类)
16.db.sqlite3 自带的小型数据库
urls.py 路由层
views.py 视图层
templates 模板层
models.py 模型层
- 导入方式:
from django.template import Template, TemplateDoesNotExist
静态文件资源
- 静态文件是html页面上使用不经常改变的资源(css,js,img)
- 对静态文件进行分门别类,自己创建static文件
- 访问静态文件资源就需要提前开设该资源相应的接口
django动态解析
- 动态解析
{% load static %} <link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.css' %}"> - django配置
1. INSTALLED_APPS = [ 'app01.apps.App01Config', ] # 在INSTALLED_APPS列表中找到该配置,没有需要手动添加app名称['app01',] 2.django启动报错,版本不适配问题 'DIRS': [BASE_DIR / 'templates'] # 修改该环境地址为 'DIRS':[os.path.join(BASE_DIR,'templates')] 3.流程 1.urls.py中添加对应关系 2.views.py编写核心逻辑 3.前端交互 4.请求方法: 1.get 索要数据 GET请求没有请求体(HTTP数据格式) 携带的额外参数大小不能超过2KB,只能是非敏感数据 form表单默认的请求方式是GET请求 2.post 提交数据 5.request对象方法 request.method 该方法可以获取请求方式(GET/POST)纯大写 request.POST 获取POST请求发送来的普通数据(不包含文件) request.POST.get() 不指定,默认只获取字典里面列表中最后一个数据 request.POST.getlist() 默认获取键对应的整个列表,有几个拿几个,也可以在括号内填写索引值 request.GET 获取URL后面携带的非敏感数据 request.GET.get() 不指定,默认只获取列表中的是最后一个 request.GET.getlist() 获取键对应的整个列表,有几个拿几个 6.Django连接数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 指定数据库软件名称 'NAME': 'mypycharm', # 指定库名 'USER': 'root', # mysql账户名 'PASSWORD': '', # mysql密码 'HOST': '127.0.0.1', # 本机地址 'PORT': '3306', # mysql默认端口号 'CHARSET':'utf8' # 字符编码 } }
orm
- orm(对象关系映射)
- 使用orm创建数据库
1.先去应用目录下的model.py编写模型类 2.数据库迁移/同步命令 1. 将models中有关数据库的操作记录下来(migration文件夹) python38 manage.py makemigrations 2. 将操作影响到数据库 python38 manage.py migrate 3.orm语法 1.在models.py外用orm需要导入 from app01 import models 2.增 models.表名.objects.create() 3.查 models.表名.objects.filter() 获取值,可以使用first()方法, 4.改 models.表名.objects.filter(id=?).update(name='新名字',password='新密码') 5.删 models.表名.objects.filter(id=?).delete() - orm外键关联
一对多 外键字段建在多的一方 models.ForeignKey(to='单表',on_delete=models.CASCADE 多对多 外键字段建在第三张关系表 models.ManyToManyField(to='多表') 一对一 外键字段建在查询频率较高的表中 models.OneToOneField(to='单表',on_delete=models.CASCADE) on_delete=models.CASCADE 级联删除
django请求生命周期
1.路由层
2.视图层
3.模板层
4.模型层
5.django插件
6.django中间件
django请求生命周期流程图
- 路由匹配
urls.py里面 path('网址后缀',函数名) 一旦网址后缀匹配上就会自动执行后面的函数,并结束整个路由的匹配- 1.路由结尾默认情况下不写斜杠,django会自动做二次处理
- 2.当我们无法确定自己的网址后缀(网址后缀不固定)时,可以使用转换器来匹配网址后缀
'int': IntConverter(), # 常用 'str': StringConverter(), # 常用 path('func/<int:year>/<str:info>/',views.func) # 使用转换器会对视图函数产生影响 # 转换器匹配到的内容需要当作视图函数的关键字参数传入 # 转换器有几个,视图函数的参数就必须有几个 - 3.re_path正则匹配
re_path(正则表达式,函数名) 无名分组: re_path('^test/(\d+)/', views.test) 正则表达式匹配到的内容会当作视图函数的位置参数传递给视图函数 有名分组: re_path('^test/(?P<year>\d+)/(?P<others>.*?)/', views.test) 正则表达式匹配到的内容会当做视图函数的关键字参数传递给视图函数 在django1.11中只支持正则匹配,方法是: url() 在django2之后:只有path(),re_path() # re_path()等价于django1中的url()
反向解析
```
反向解析: 返回一个结果,该结果可以访问对于的路由
路由对应关系起别名
path('register/',views.reg,name='reg_view')
反向解析语法的使用
前端HTML网页: {% url 'reg_view' %}
后端:
from django.shortcuts import reverse
reverse('reg_view')
```
路由分发
1.django中的应用都可以有自己独立文件
urls.py、templates文件夹、static文件夹
2.总路由负责将指明道路,子路由负责操作数据
path('app01/', include('app01.urls')), # 总
path('after/', views.after) # app01 # 子
django名称空间
- 1.有路由分发场景下多个应用在涉及到反向解析别名冲突的时候无法正常解析
解决方式1:
*名称空间
namespace
path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
path('app01/', include(('app01.urls', 'app02'), namespace='app02'))
解决方式2:
* 别名不冲突即可
* 保证django项目下没有重复的别名即可