day 49 Django 基本原理
00.三大主流web框架
- django
- 大而全,自带的组件和功能非常多
- 内部有检测机制,在运行状态下修改代码,会自动重启可能会报错,最好修改过后手动重启一次
- 缺点;写小项目时可能会比较笨重
- a使用wsgiref(django默认可修改),b、c自己写的
- 大而全,自带的组件和功能非常多
- flask
- 小而精,自带的组件特别少,功能基本依靠第三方组件
- 缺点;受限于第三方模块的影响
- 如果将第三方模块加起来能够盖过django
- a使用werkzeug,b自己写,c使用janja2
- tornado
- 异步非阻塞,执行速度快,甚至可以用来开发游戏服务器
- a、b、c都是自己写的
01.结构
-
三大组成
- a;socket部份
- b;路由配置
- c;模版语法
-
socket部份
-
后端接收到的web请求结构
请求首行 b'GET /请求功能 HTTP/1.1 请求头 Host: 127.0.0.1:8080 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36 Sec-Fetch-User: ?1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 Sec-Fetch-Site: none Sec-Fetch-Mode: navigate Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: csrftoken=aOZSalMQkKGbzstfjcw3O9sDoegdywL8AD7PzhidAyx3tXShN7oQtxN1MMnS6GVX (******) 请求体
-
接收到后对数据进行处理,得到需要的数据如请求功能
-
再根据功能分派不同的页面返回给浏览器
-
-
路由配置;通过键值对或元组的形势将路由和功能函数对应起来
-
模版语法
-
用来处理后端数据与html页面的交互
-
jinja2(语法极其贴近后端python语法)能够在html页面上来操作后端传递过来的数据
<p>{{ userDic }}</p> <p>{{ userDic.username }}</p> <p>{{ userDic['age'] }}</p> <p>{{ userDic.get('hobby') }}</p> <p>{{ userDic.get('hobby').0 }}</p> <p>{{ userDic.get('hobby').1 }}</p> <p>{{ userDic.get('hobby').2 }}</p> {% for user_dic in user_list %} <!--jinja2的for循环--> <tr> <td>{{ user_dic.id }}</td> <td>{{ user_dic.username }}</td> <td>{{ user_dic.password }}</td> </tr> {% endfor %} <!--需要添加for循环终止--> <!-- 模版的渲染。动态添加的数据是在后端处理生成的一个完整的html的过程 渲染是在后端完成的,与前端无关(如表格的生成等。。。。) -->
-
-
django项目同名文件夹下
- settings.py;配置文件,创建好的app需要再INSTALLED——APPS中添加方可生效
- wsgi.py;wsgiref文件
- urls.py;路由与视图函数对应关系,自己写的功能需要手动添加到这里
-
app文件夹下
- admin.py;django admin后台管理
- apps.py;注册app使用
- models.py;放所有数据库相关的模型类
- views.py;处理业务逻辑的视图函数
- migrations文件夹;所有数据库相关的操作记录
- test.py;提供给你用来测试的文件
-
manage.py;django的入口文件
-
templates文件夹
用来存储html页面,终端创建任务需要手动添加改文件夹并在settings文件下书写路径
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')]//添加路径 , 'APP_DIRS': True,
03.django 三板斧
from django.shortcuts import render,HttpResponse,redirect
-
HttpResponse;返回字符串
def index(request): return HttpResponse("一串字符串")
-
render;返回html文件
def login(requset): user_dic = {"username": "jason", "password": "123456"} return render(requset, "login.html", {'xxx':user_dic}) # 将dic传入html # django的模版语法字典只支持对象.属性的方式
-
redirect;重定向
def home(requset): return redirect("/login") # 定向到本地login页面 return redirect("https://www.baidu.com") # 定向到外部百度页面