59-django-自写简易版web框架、django框架初识、django安装使用

今日内容概要

  • 自写简易版web框架(重点理解无需掌握)
  • django框架初识

今日内容详细

 HTTP协议

 1 """
 2 网络协议
 3 HTTP协议                数据传输是明文
 4 HTTPS协议                数据传输是密文
 5 websocket协议        数据传输是密文
 6 
 7 
 8 四大特性
 9     1.基于请求响应
10     2.基于TCP、IP作用于应用层之上的协议
11     3.无状态
12     4.短/无链接
13 
14 数据格式
15     请求首行
16     请求头
17     
18     请求体
19 
20 响应状态码
21     1XX
22     2XX            200
23     3XX            
24     4XX            403 404
25     5XX            500
26 """
27 # 如何做到后缀的不同返回不同的内容
28     # 拿到用户输入的后缀 做判断 
29 
30   
31 # 不足之处
32   1.代码重复(服务端代码所有人都要重复写)
33   2.手动处理http格式的数据 并且只能拿到url后缀 其他数据获取繁琐(数据格式一样处理的代码其实也大致一样 重复写)
34   3.并发的问题

纯手撸web框架

 1 # 你可以将web框架理解成服务端
 2 import socket
 3 
 4 
 5 server = socket.socket()  # TCP  三次握手四次挥手  osi七层
 6 server.bind(('127.0.0.1',8080))  # IP协议 以太网协议 arp协议...
 7 server.listen(5)  # 池 ...
 8 
 9 """
10 b'GET / HTTP/1.1

11 Host: 127.0.0.1:8082

12 Connection: keep-alive

13 Upgrade-Insecure-Requests: 1

14 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36

15 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9

16 Sec-Fetch-Site: none

17 Sec-Fetch-Mode: navigate

18 Sec-Fetch-User: ?1

19 Sec-Fetch-Dest: document

20 Accept-Encoding: gzip, deflate, br

21 Accept-Language: zh-CN,zh;q=0.9

22 Cookie: csrftoken=KYJnVBLPpJxwt09TOmTXzpb5qkFJwHVxVGpi0NxEGIg4z5VUuazZ1O2RMwSisu14

23 
'
24 
25 
26 """
27 while True:
28     conn, addr = server.accept()
29     data = conn.recv(1024)
30     # print(data)  # 二进制数据
31     data = data.decode('utf-8')  # 字符串
32     # 获取字符串中特定的内容       正则  如果字符串有规律也可以考虑用切割
33     conn.send(b'HTTP/1.1 200 OK

')
34     current_path = data.split(' ')[1]
35     # print(current_path)
36     if current_path == '/index':
37         # conn.send(b'index heiheihei')
38         with open(r'templates/01 myhtml.html', 'rb') as f:
39             conn.send(f.read())
40     elif current_path == '/login':
41         conn.send(b'login')
42     else:
43         # 你直接忽略favicon.ico
44         conn.send(b'hello web')
45     conn.close()
纯手撸web框架

借助于wsgiref模块

1 """
2 urls.py               路由与视图函数对应关系
3 views.py              视图函数(后端业务逻辑)
4 templates文件夹        专门用来存储html文件
5 """
6 # 按照功能的不同拆分之后 后续添加功能只需要在urls.py书写对应关系然后取views.py书写业务逻辑即可
 1 from wsgiref.simple_server import make_server
 2 from urls import urls
 3 from views import *
 4 
 5 
 6 def run(env, response):
 7     """
 8     :param env:请求相关的所有数据
 9     :param response:响应相关的所有数据
10     :return: 返回给浏览器的数据
11     """
12     # print(env)  # 大字典  wsgiref模块帮你处理好http格式的数据 封装成了字典让你更加方便的操作
13     # 从env中取
14     response('200 OK', [])  # 响应首行 响应头
15     current_path = env.get('PATH_INFO')
16     # if current_path == '/index':
17     #     return [b'index']
18     # elif current_path == '/login':
19     #     return [b'login']
20     # return [b'404 error']
21     # 定义一个变量 存储匹配到的函数名
22     func = None
23     for url in urls:  # url (),()
24         if current_path == url[0]:
25             # 将url对应的函数名赋值给func
26             func = url[1]
27             break  # 匹配到一个之后 应该立刻结束for循环
28     # 判断func是否有值
29     if func:
30         res = func(env)
31     else:
32         res = error(env)
33 
34     return [res.encode('utf-8')]
35 
36 
37 if __name__ == '__main__':
38     server = make_server('127.0.0.1',8080,run)
39     """
40     会实时监听127.0.0.1:8080地址 只要有客户端来了
41     都会交给run函数处理(加括号触发run函数的运行)
42     
43     flask启动源码
44         make_server('127.0.0.1',8080,obj)
45         __call__
46     """
47     server.serve_forever()  # 启动服务端
基于wsgiref模块的web框架
 1 from views import *
 2 
 3 # url与函数的对应关系
 4 urls = [
 5     ('/index',index),
 6     ('/login',login),
 7     ('/xxx',xxx),
 8     ('/get_time',get_time),
 9     ('/get_dict',get_dict),
10     ('/get_user',get_user)
11 ]
urls.py
 1 def index(env):
 2     return 'index'
 3 
 4 
 5 def login(env):
 6     return "login"
 7 
 8 
 9 def error(env):
10     return '404 error'
11 
12 
13 def xxx(env):
14     with open(r'templates/02 myxxx.html', 'r', encoding='utf-8') as f:
15         return f.read()
16 
17 import datetime
18 def get_time(env):
19     current_time = datetime.datetime.now().strftime('%Y-%m-%d %X')
20     # 如何将后端获取到的数据"传递"给html文件?
21     with open(r'templates/03 mytime.html', 'r', encoding='utf-8') as f:
22         data = f.read()
23         # data就是一堆字符串
24     data = data.replace('dwadasdsadsadasdas',current_time)   # 在后端将html页面处理好之后再返回给前端
25     return data
26 
27 
28 from jinja2 import Template
29 def get_dict(env):
30     user_dic = {'username':'jason','age':18,'hobby':'read'}
31     with open(r'templates/04 get_dict.html', 'r', encoding='utf-8') as f:
32         data = f.read()
33     tmp = Template(data)
34     res = tmp.render(user=user_dic)
35     # 给get_dict.html传递了一个值 页面上通过变量名user就能够拿到user_dict
36     return res
37 
38 
39 import pymysql
40 def get_user(env):
41     # 去数据库中获取数据 传递给html页面 借助于模版语法 发送给浏览器
42     conn = pymysql.connect(
43         host = '127.0.0.1',
44         port = 3306,
45         user = 'root',
46         password = 'admin123',
47         db='day59',
48         charset = 'utf8',
49         autocommit = True
50     )
51     cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
52     sql = 'select * from userinfo'
53     affect_rows = cursor.execute(sql)
54     data_list = cursor.fetchall()  # [{},{},{}]
55     # 将获取到的数据传递给html文件
56     with open(r'templates/05 get_data.html', 'r', encoding='utf-8') as f:
57         data = f.read()
58     tmp = Template(data)
59     res = tmp.render(user_list=data_list)
60     # 给get_dict.html传递了一个值 页面上通过变量名user就能够拿到user_dict
61     return res
62 
63 
64 if __name__ == '__main__':
65     get_user(111)
views.py

动静态网页

 1 """
 2 静态网页
 3     页面上的数据是直接写死的 万年不变
 4 动态网页
 5     数据是实时获取的
 6     eg:
 7         1.后端获取当前时间展示到html页面上
 8         2.数据是从数据库中获取的展示到html页面上
 9 """
10 
11 # 动态网页制作
12 import datetime
13 def get_time(env):
14     current_time = datetime.datetime.now().strftime('%Y-%m-%d %X')
15     # 如何将后端获取到的数据"传递"给html文件?
16     with open(r'templates/03 mytime.html','r',encoding='utf-8') as f:
17         data = f.read()
18         # data就是一堆字符串
19     data = data.replace('dwadasdsadsadasdas',current_time)   # 在后端将html页面处理好之后再返回给前端
20     return data
21 
22 # 将一个字典传递给html文件 并且可以在文件上方便快捷的操作字典数据
23 from jinja2 import Template
24 def get_dict(env):
25     user_dic = {'username':'jason','age':18,'hobby':'read'}
26     with open(r'templates/04 get_dict.html','r',encoding='utf-8') as f:
27         data = f.read()
28     tmp = Template(data)
29     res = tmp.render(user=user_dic)
30     # 给get_dict.html传递了一个值 页面上通过变量名user就能够拿到user_dict
31     return res
32 
33 # 后端获取数据库中数据展示到前端页面

模版语法之Jinja2模块

 1 pip3 install jinja2
 2 """模版语法是在后端起作用的"""
 3 
 4 # 模版语法(非常贴近python语法)
 5 {{ user }}
 6 {{ user.get('username')}}
 7 {{ user.age }}
 8 {{ user['hobby'] }}
 9 
10 
11 {% for user_dict in user_list %}
12                         <tr>
13                             <td>{{ user_dict.id}}</td>
14                             <td>{{ user_dict.username}}</td>
15                             <td>{{ user_dict.password}}</td>
16                             <td>{{ user_dict.hobby}}</td>
17                         </tr>
18 {% endfor%}

自定义简易版本web框架请求流程图

1 """
2 wsgiref模块
3     1.请求来的时候解析http格式的数据 封装成大字典
4     2.响应走的时候给数据打包成符合http格式 再返回给浏览器
5 
6 """

python三大主流web框架

 1 """
 2 django
 3     特点:大而全 自带的功能特别特别特别的多 类似于航空母舰
 4     不足之处:
 5         有时候过于笨重
 6 
 7 flask
 8     特点:小而精  自带的功能特别特别特别的少 类似于游骑兵
 9     第三方的模块特别特别特别的多,如果将flask第三方的模块加起来完全可以盖过django
10     并且也越来越像django
11     不足之处:
12         比较依赖于第三方的开发者
13         
14 tornado
15     特点:异步非阻塞 支持高并发
16         牛逼到甚至可以开发游戏服务器
17     不足之处:
18         暂时你不会
19 """
20 A:socket部分
21 B:路由与视图函数对应关系(路由匹配)
22 C:模版语法
23 
24 django
25     A用的是别人的        wsgiref模块
26   B用的是自己的
27   C用的是自己的(没有jinja2好用 但是也很方便)
28 
29 flask
30     A用的是别人的        werkzeug(内部还是wsgiref模块)
31   B自己写的
32   C用的别人的(jinja2)
33 
34 tornado
35     A,B,C都是自己写的

django安装使用注意事项

 1 # 如何让你的计算机能够正常的启动django项目
 2   1.计算机的名称不能有中文
 3   2.一个pycharm窗口只开一个项目
 4   3.项目里面所有的文件也尽量不要出现中文
 5   4.python解释器尽量使用3.4~3.6之间的版本
 6       (如果你的项目报错 你点击最后一个报错信息
 7     去源码中把逗号删掉)
 8     
 9 # django版本问题
10     1.X 2.X 3.X(直接忽略)
11   1.X和2.X本身差距也不大 我们讲解主要以1.X为例 会讲解2.X区别
12   公司之前用的1.8 满满过渡到了1.11版本 有一些项目用的2.0
13  
14 # django安装
15     pip3 install django==1.11.11
16   如果已经安装了其他版本 无需自己卸载
17   直接重新装 会自动卸载安装新的
18   
19   如果报错 看看是不是timeout 如果是 那么只是网速波动
20   重新安装即可
21   
22   验证是否安装成功的方式1
23     配置完django环境变量之后
24       终端输入django-admin看看有没有反应
25 
26   验证是否安装成功的方式2
27     解释器: import django
28             django.get_version()

django基本操作

 1 # 命令行操作
 2     # 1.创建django项目
 3       """
 4       你可以先切换到对应的D盘 然后再创建
 5       """
 6       django-admin startproject mysite
 7     
 8         mysite文件夹
 9           manage.py
10           mysite文件夹
11             __init__.py
12             settings.py
13           urls.py
14           wsgi.py
15  # 2.启动django项目
16     """
17         一定要先切换到项目目录下    
18         cd /mysite
19     """
20   python3 manage.py runserver
21   # http://127.0.0.1:8000/
22  
23 # 3.创建应用
24 """
25 Next, start your first app by running python manage.py startapp [app_label].
26 """
27     python manage.py startapp app01
28     应用名应该做到见名知意
29       user
30       order
31       web
32       ...
33       但是我们教学统一就用app01/02/03/04
34       
35     有很多文件
36   
37 # pycharm操作
38     # 1 new project 选择左侧第二个django即可
39   
40   # 2 启动
41           1.还是用命令行启动
42         2.点击绿色小箭头即可
43 
44   # 3 创建应用
45           1.pycharm提供的终端直接输入完整命令
46         2.pycharm 
47               tools 
48                 run manage.py task提示(前期不要用 给我背完整命令)
49  # 4 修改端口号以及创建server    
50         edit confi....

应用

 1 """
 2 django是一款专门用来开发app的web框架
 3 
 4 django框架就类似于是一所大学(空壳子)
 5 app就类似于大学里面各个学院(具体功能的app)
 6     比如开发淘宝
 7         订单相关
 8         用户相关
 9         投诉相关
10         创建不同的app对应不同的功能
11     
12     选课系统
13         学生功能
14         老师功能
15 
16 一个app就是一个独立的功能模块
17 """
18 ***********************创建的应用一定要去配置文件中注册**********************
19 INSTALLED_APPS = [
20     'django.contrib.admin',
21     'django.contrib.auth',
22     'django.contrib.contenttypes',
23     'django.contrib.sessions',
24     'django.contrib.messages',
25     'django.contrib.staticfiles',
26     'app01.apps.App01Config',  # 全写
27       'app01',             # 简写
28 ]
29 # 创建出来的的应用第一步先去配置文件中注册 其他的先不要给我干
30 ps:你在用pycharm创建项目的时候 pycharm可以帮你创建一个app并且自动注册
31 ***********************************************************************

主要文件介绍

 1 -mysite项目文件夹
 2     --mysite文件夹
 3       ---settings.py    配置文件
 4     ---urls.py            路由与视图函数对应关系(路由层)
 5     ---wsgi.py            wsgiref模块(不考虑)
 6   --manage.py                django的入口文件
 7   --db.sqlite3            django自带的sqlite3数据库(小型数据库 功能不是很多还有bug)
 8   --app01文件夹
 9       ---admin.py            django后台管理
10     ---apps.py            注册使用
11     ---migrations文件夹        数据库迁移记录
12     ---models.py        数据库相关的 模型类(orm)
13       ---tests.py            测试文件
14     ---views.py            视图函数(视图层)

命令行与pycharm创建的区别

 1 # 1 命令行创建不会自动有templatew文件夹 需要你自己手动创建而pycharm会自动帮你创建并且还会自动在配置文件中配置对应的路径
 2 # pycharm创建
 3 TEMPLATES = [
 4     {
 5         'BACKEND': 'django.template.backends.django.DjangoTemplates',
 6         'DIRS': [os.path.join(BASE_DIR, 'templates')]
 7 ]
 8 # 命令行创建
 9 TEMPLATES = [
10     {
11         'BACKEND': 'django.template.backends.django.DjangoTemplates',
12         'DIRS': [],
13 ]
14 """
15 也就意味着你在用命令创建django项目的时候不单单需要创建templates文件夹还需要去配置文件中配置路径
16 'DIRS': [os.path.join(BASE_DIR, 'templates')]
17 """

django小白必会三板斧

 1 from django.shortcuts import render, HttpResponse, redirect 
 2 """
 3 HttpResponse
 4     返回字符串类型的数据
 5     return HttpResponse('你好,我是你爸爸')
 6 render
 7     返回html文件的
 8     return render(request, 'myfirst.html')
 9 redirect
10     重定向
11     return redirect('https://www.mzitu.com/')
12     return redirect('/home/')
13 """

今日测试

"""
今日考题
1.谈谈你对web框架的认识,简述web框架请求流程
2.python三大主流web框架的区别
3.安装django需要注意的事项有哪些(最少三条及以上,越多越好)
4.如何验证django是否安装成功,命令行如何创建django项目,如何启动django项目。与pycharm创建django项目的区别?
5.什么是app,django中如何创建app,需要注意什么
"""

今日内容回顾

纯手撸web框架

1 """
2 1.socket代码需要我们自己写
3 2.http格式的数据自己处理(只能拿到用户输入的路由)
4 """
纯手撸web框架

基于wsgiref模块

1 """
2 1.帮助你封装了socket代码
3 2.帮你处理http格式的数据(大字典)
4 
5 web服务网关接口
6     1.请求来的时候帮助你自动拆分http格式数据并封装成非常方便处理的数据格式
7     2.响应走的时候帮你讲数据再打包成符合http格式
8 """
基于wsgiref模块

根据功能的不同拆分成不同py文件(关键)

 1 urls.py
 2     路由与视图函数对应关系
 3 views.py(后端业务逻辑)
 4     业务逻辑的视图函数
 5       ps:视图函数可以是函数其实也可以是类
 6       面向函数式编程
 7       面向对象式编程
 8 templates模版文件夹
 9     存储html文件
10 # 拆分完成后 后续要想添加功能 只需要在urls.py和views.py中书写对应的代码即可
根据功能的不同拆分成不同py文件(关键)

动静态网页

 1 # 根据html页面内容是写死的还是从后端动态获取的
 2     1.后端获取当前时间
 3   2.从数据库获取数据
 4   ...
 5 """
 6 如何讲后端的数据传递给html文件(在后端发生的不在浏览器上)
 7     1.lowb版本 利用字符串的替换
 8     2.jinja2模版语法
 9         即支持给html传数据
10         还提供了一系列快捷方式操作数据(模版语法)
11             {{ user_list }}
12             
13             {%for i in user_list %}
14             {%enfor%}
15         jinja2的模版语法及其的贴近python语法 并且有时候比python语法更加的简单
16 """
17 
18 # 利用wsgiref模块封装的web框架加上jinja2模版语法 结合前端后端数据库
动静态网页

python三大主流web框架

 1 # 在你没有多少基础的时候切记不要同时学习下面多个,不然容易混淆!!!
 2 """
 3 django
 4     大而全  类似于航空母舰
 5     但是有时候过于笨重
 6 flask
 7     小而精        类似于游骑兵(单行代码就可以起一个flask服务)
 8     第三方组件很多 但是有时候也会受限于第三方
 9 tornado
10     异步非阻塞
11     速度非常快
12 
13 SANIC
14 FASTAPI
15 ...
16 """
python三大主流web框架

注意事项

 1 """
 2 1.计算机名称不能有中文
 3 2.一个pycharm窗口不要打开多个项目(跟不要出现文件夹套文件夹多级目录的出现)
 4     day01
 5     day02
 6     ...
 7 3.文件名也不要出现中文
 8 4.python解释器版本建议使用3.6
 9         如果django安装成功了但是启动就报错
10         那么点击报错的那一行将那一行源码的逗号删除即可
11 5.版本问题
12     1.X
13     2.X
14     LTS维护时间
15     两个版本之间差距不大 完全不影响你的学习
16     
17     
18     pip3 install django==1.11.11
19     环境变量配置 多版本共存
20 """
注意事项

django必会命令

 1 # 命令行
 2     1.创建django项目(先切换到一个盘中D:)
 3       django-admin startproject mysite
 4     
 5     mysite
 6         mysite
 7       manage.py
 8   2.启动django项目(先切换到mysite路径下)
 9       python3 manage.py runserver 127.0.0.1:9090
10   3.创建应用
11       python3 manage.py startapp app01
12 """
13 1.一个django项目就类似于是一个空壳子 本身没有任何的内容(大学)
14 应用就类似于是一个个的功能模块(学院)
15 
16 2.创建应用之后一定要先去配置文件中注册才能生效
17 INSTALLED_APPS = [
18     'app01'  # 简写
19     ‘app01.apps.App01Config’  # 全称
20 ]
21 """
22 
23 # pycharm创建
24 """
25 1.命令行创建不会自动创建templates文件夹并且也不会自动配置路径
26     DIR:[os.path.join(BASE_DIR,'templates')]
27 2.pycharm则会自动创建并且自动配置路径
28 3.pycharm还可以自动帮你创建一个应用并且自动注册(只能创一个)
29 """
30 
31 """
32 django主要文件介绍
33     -mysite
34         --mysite
35             ---urls.py
36             ---settings.py
37             ...
38         -manage.py
39         -app01
40             --migrations
41                 数据库迁移记录
42             --apps.py
43             --tests.py
44             --models.py
45             --views.py
46 """
django必会命令

django小白必会三板斧

 1 from django.shortcuts import HttpResponse,render,redirect
 2 
 3 return HttpResponse('字符串')
 4 
 5 return render(request,'login.html')
 6 def ab_render(request):
 7     # 视图函数必须要接受一个形参request
 8     user_dict = {'username':'jason','age':18}
 9     # 第一种传值方式:更加的精确 节省资源
10     # return render(request,'01 ab_render.html',{'data':user_dict,'date':123})
11     # 第二种传值方式:当你要传的数据特别多的时候
12     """locals会将所在的名称空间中所有的名字全部传递给html页面"""
13     return render(request,'01 ab_render.html',locals())
14     
15 return redirect(url)
django小白必会三板斧

作业

1 """
2 1.整理web框架推导思路
3 2.安装django并正常启动访问,测试三板斧
4 3.整理今日日考题,django内容
5 选做题
6 1.结合前端,django,MySQL,pymysql模块实现数据库数据动态展示到前端
7 2.尝试着摸索django模版语法
8 """
原文地址:https://www.cnblogs.com/wgwg/p/13056674.html