django框架推导过程、简介、基本操作命令、目录结构

莱莱  金牌会员 | 2022-9-16 17:21:32 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 683|帖子 683|积分 2049

目录

Web框架


Web框架可以简单的理解为是基于互联网的Web服务端>>>:socket服务端
1.WeB框架本质认识
  1. 1.我们可以这样理解:我们所写的Web框架其实就是一个socket服务端,而且用户的浏览器就是一个socket客户端。
  2. 2.本质上:浏览器是一个socket客户端,服务器是一个socket服务端
复制代码
2.MVC设计模型
  1. 我们先对 MVC 设计模式进行介绍,它是 Web 设计模式的经典之作,MTV 模式也是在它的基础上衍生而来。
  2. MVC 是 Model-View-Controller 的缩写,其中每个单词都有其不同的含义:
  3.     Modle 代表数据存储层,是对数据表的定义和数据的增删改查;
  4.     View 代表视图层,是系统前端显示部分,它负责显示什么和如何进行显示;
  5.     Controller 代表控制层,负责根据从 View 层输入的指令来检索 Model 层的数据,并在该层编写代码产生结果并输出。
复制代码
3.MVC 设计模式的请求与响应过程
  1. 用户通过浏览器向服务器发起 request 请求,Controller 层接受请求后,同时向 Model 层和 View 发送指令;
  2. Mole 层根据指令与数据库交互并选择相应业务数据,然后将数据发送给 Controller 层;
  3. View 层接收到 Controller 的指令后,加载用户请求的页面,并将此页面发送给 Controller 层;
  4. Controller 层接收到 Model 层和 View 层的数据后,将它们组织成响应格式发送给浏览器,浏览器通过解析后把页面展示出来。
复制代码

4.Django的MTV设计模型

Django 借鉴了经典的MVC 模式,它将交互的过程分为3个层次,也就是MTV设计模式;
  1. Model:数据存储层,处理所有数据相关的业务,和数据库进行交互,并提供数据的增删改查;
  2. Template:模板层(也叫表现层)具体来处理页面的显示;
  3. View:业务逻辑层,处理具体的业务逻辑,它的作用是连通Model 层和 Template 。
复制代码
5.djangoMTV设计模式的请求与响应过程
  1. 用户通过浏览器对服务器发起 request 请求,服务器接收请求后,通过 View 的业务逻辑层进行分析,同时向 Model 层和 Template 层发送指令;
  2. Mole 层与数据库进行交互,将数据返回给 View 层;
  3. Template 层接收到指令后,调用相应的模板,并返回给 View 层;
  4. View 层接收到模板与数据后,首先对模板进行渲染(即将相应的数据赋值给模板),然后组织成响应格式返回给浏览器,浏览器进行解析后并最终呈现给用户。
复制代码
6.HTTP协议
  1. 超文本传输协议:规定了浏览器与服务器之间数据交互的格式
  2.    
  3. HTTP协议的四大特性:
  4.     1.基于请求响应  -- 浏览器给服务端发起请求,服务端收到后做出回应
  5.     2.基于TCP、IP协议作用于应用层之上的协议
  6.     3.无状态  -- 不保存用户端的登录状态,见你千百遍我都当你如初见
  7.     4.无(短)连接  -- 一次请求响应后即断开连接
  8. HTTP协议的数据传输格式:
  9.     1.请求数据格式:
  10.          请求首行(请求方法...)
  11.          请求头(一大堆K:V键值对)
  12.           \r\n  ---换行
  13.          请求体(并不是所有的请求方法都有  主要用来携带敏感性数据)
  14.     2.响应数据格式:
  15.         响应首行(响应状态码...)
  16.         响应头(一大堆k:v键值对)
  17.          \r\n   ---换行
  18.         响应体(展示给用户的数据)
  19. post与get请求方法:
  20.     1.get请求
  21.         朝别人索要数据
  22.     2.post请求
  23.         朝别人提交数据
  24. >>>上述两种请求都可以携带额外的参数<<<
  25. get请求携带数据的方式:
  26.        url?username=jason&hobby=mn
  27. post请求携带数据的方式:
  28.       数据是放在请求体里面的
复制代码
html代码
  1. import socket
  2. server = socket.socket()
  3. server.bind(('127.0.0.1', 8080))
  4. server.listen(5)
  5. while True:
  6.     sock , address = server.accept()
  7.     data = sock.recv(1024)
  8.     # print(data.decode('utf8'))
  9.     sock.send(b'HTTP/1.1 200 ok\r\n\r\n')
  10.     target_url = data.decode('utf8').split(' ')[1]  # 按照空格切割,然后拿去切割后得第二个数据,拿到的就是我们输入后台网站的后缀
  11.     if target_url == '/index':
  12.         sock.send(b'index view')
  13.     elif target_url == '/login':
  14.         sock.send(b'login view')
  15.     elif target_url == '/reg':
  16.         sock.send(b'reg view')
  17.     else:
  18.         sock.send(b'404 error')
复制代码
views代码
  1. 1.socket服务端代码
  2. 2.HTTP协议
  3. 3.根据网址后缀的不同请求不同的内容
  4. 4.请求方式
  5.         GET:朝服务端索要数据
  6.         POST:朝服务端提交数据
  7. 5.从请求数据格式中筛选出用户输入的网址后缀(从字符串中截取出来需要得内容)
  8.         target_url = data.decode('utf8').split(' ')[1]
  9. 6.代码的缺陷
  10.         1.socket代码重复编写造轮子
  11.         2.针对请求数据格式的处理复杂且重复
  12.         3.针对不同网址后缀的匹配方式过于lowB
复制代码
urls代码
  1. import wsgiref
  2. from wsgiref.simple_server import make_server
  3. from urls import urls
  4. from view import *
  5. def run(request, response):
  6.     """
  7.     :param request: 请求数据
  8.     :param response: 响应数据
  9.     :return: 返回给客户端的数据
  10.     """
  11.     response('200 ok',[])
  12.     # print(request)  # 自动将请求数据全部处理成字典K:V键值对形式
  13.     target_path = request.get('PATH_INFO')  # /login
  14.     # if target_path == '/index':
  15.     #     return [b'index']
  16.     # elif target_path == '/login':
  17.     #     return [b'index']
  18.     # elif target_path == '/reg':
  19.     #     return [b'reg']
  20.     # else:
  21.     #     return [b'404 not found']
  22.     func_name = None
  23.     for url_tuple in urls:  # ('/index',index)
  24.         if url_tuple[0] == target_path:
  25.             func_name = url_tuple[1]  # 先存储匹配到的函数名
  26.             break  # 一旦匹配到内容就立刻结束for循环 没有必要继续往下执行了
  27.     # for 循环结束以后,还需要判断func_name是不是为None(有可能没有匹配上)
  28.     if func_name:
  29.         res = func_name(request)
  30.     else:
  31.         res = error(request)
  32.     return [res.encode('utf8')]  # 做统一编码处理,这样函数就只需要返回字符串即可,操作更简单
  33. if __name__ == '__main__':
  34.     server = make_server('127.0.0.1',8080, run)  # 任何访问127.0.0.1:8080的请求都会给第三个参数加括号进行调用
  35.     server.serve_forever()
复制代码
jinja2模块
  1. from view import *
  2. urls = (
  3.     ('/index', index),
  4.     ('/login', login),
  5.     ('/func', func)
  6. )
复制代码
html代码
  1. def index(request):
  2.     return 'index'
  3. def login(request):
  4.     return 'login'
  5. def error(request):
  6.     return '404'
  7. def func(request):
  8.     with open(r'myhtml02.html', 'r') as f:
  9.         data = f.read()
  10.     return data
复制代码
views代码
  1. 1.wsgiref模块解决了两个问题
  2.     1.socket代码重复编写造轮子
  3.     2.针对请求数据格式的处理复杂且重复
  4. 2.思考如何再次实现根据不同的网址后缀返回不同的内容(函数化)
  5.     先从大字典中查找出记录网址后缀的键值对
  6.     1.不推荐使用连续的多个if判断
  7.     2.针对面条版的代码首先应该考虑封装成函数,封装成函数以后的好处就是,之后如果要添加页面的时候只需要再写一个函数就可以了,如果要修改某个页面,只需要找到对应的函数修改函数就可以了
  8.     3.想在函数里再获取一些方法,想看一下前端发过来的到底是什么方法,将request作为参数传给函数run函数里面的其他函数
  9.     4.现在我们在一个py文件里写了好多功能(处理页面请求的核心逻辑、对应关系、服务端的代码),这样太乱了,根据py文件中功能的不同划分到不同的py文件中去
  10.         urls.py                          对应关系
  11.         views.py                  功能函数
  12.         start.py                  启动文件
  13.         templates文件夹                 存储html
复制代码
前端、后端和数据库三者联动

html代码
  1. 动态网页
  2.     页面上的数据不是全部写死的 有些是动态获取(后端传入)
  3. 静态网页
  4.     页面上的数据直接写死的 要想改变只能修改源码
  5. 实际需求
  6.     后端代码回去当前时间 然后让前端页面展示
  7.     1.字符串替换
  8.     2.将字典数据传递给html页面并且想要在页面上操作字典数据
  9.         我们无法自己实现>>>:在html页面上使用类似于后端的语法操作数据
复制代码
views代码
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Title</title>
  6.    
  7. </head>
  8. <body>
  9. <p>heiheihei</p>
  10. </body>
  11. </html>
复制代码
点击查看代码
  1. def get_time(request):
  2.     import time
  3.     ctime = time.strftime('%Y-%m-%d %H:%M:%S')
  4.     with open(r'templates/myhtml03.html', 'r', encoding='utf8') as f:
  5.         data = f.read()
  6.     # 如何将时间嵌入到html文件数据内,之后在返回给前端浏览器(字符串的替换)
  7.     data = data.replace('heiheihei', ctime)
  8.     return data
复制代码


web框架就是统筹前后端,实现页面的访问

html代码
  1. from views import *
  2. urls = (
  3.     ('/index', index),
  4.     ('/login', login),
  5.     ('/func', func),
  6.     ('/get_time', get_time)
  7. )
复制代码
views代码
  1. jinja2能够让我们在html文件内使用类似于后端的语法来操作各种数据类型
  2. pip3 install jinja2
  3. jinja2模板语法:
  4.   {{···}}
  5.   {%···%}
复制代码

python主流框架web框架
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Title</title>
  6.    
  7. </head>
  8. <body>
  9. <h1>{{ data }}</h1>
  10. <h1>{{ data['name'] }}</h1>
  11. <h1>{{ data.get('pwd') }}</h1>
  12. <h1>{{ data.hobby }}</h1>
  13. </body>
  14. </html>
复制代码
django框架简介

  1. from jinja2 import Template
  2. def get_dict(request):
  3.     user_dict = {'name': 'jason', 'pwd': 123, 'hobby': ['read', 'run', 'music']}
  4.     with open(r'templates/myhtml04.html', 'r', encoding='utf8') as f:
  5.         data = f.read()
  6.     temp = Template(data)
  7.     res = temp.render(data=user_dict)  # 将字典传递给html页面 页面上通过data即可获取(data仅仅是一个变量名)
  8.     return res
复制代码
1.正常运行Django项目所需要知道的注意事项

1.计算机的名称不能有中文,不然bug在哪你都不知道!

2.一个pycharm窗口只开一个django项目
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Title</title>
  6.    
  7.     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  8.    
  9. </head>
  10. <body>
  11.    
  12.         <h1 >数据展示</h1>
  13.         
  14.             <table >
  15.                 <thead>
  16.                 <tr>
  17.                     <th>主键</th>
  18.                     <th>姓名</th>
  19.                     <th>年龄</th>
  20.                 </tr>
  21.                 </thead>
  22.                 <tbody>
  23.                 {% for user in user_data %}
  24.                 <tr>
  25.                     <td>{{ user.id }}</td>
  26.                     <td>{{ user.name }}</td>
  27.                     <td>{{ user.age }}</td>
  28.                 </tr>
  29.                 {% endfor %}
  30.                 </tbody>
  31.             </table>
  32.         
  33.    
  34. </body>
  35. </html>
复制代码
3.项目里面所有的文件也尽量不要出现中文
  1. import pymysql
  2. def get_mysql(request):
  3.     conn = pymysql.connect(
  4.         host='127.0.0.1',
  5.         port=3306,
  6.         user='root',
  7.         password='123456',
  8.         database='day55',
  9.         charset='utf8',
  10.         autocommit=True
  11.     )
  12.     cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
  13.     sql = 'select * from userinfo'
  14.     cursor.execute(sql)
  15.     user_data = cursor.fetchall()  # [{},{},{}]
  16.     with open(r'templates/myhtml05.html','r',encoding='utf8') as f:
  17.         data = f.read()
  18.     temp = Template(data)
  19.     res = temp.render(user_data=user_data)
  20.     return res
复制代码
4.验证django是否下载成功

cmd终端输入django-admin

命令创建django项目

1.命令创建

1.命令行创建项目
  1. create database day55;
  2. use da55
  3. create table userinfo(id int primary key auto_increment,name varchar(32),age int);
  4. insert into userinfo(name, age) values('jason',18),('kevin',29),('tony',20);
复制代码



2.启动django项目
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Title</title>
  6.    
  7. </head>
  8. <body>
  9. <a target="_blank" href="https://www.cnblogs.com/index">index</a>
  10. <a target="_blank" href="https://www.cnblogs.com/login">login</a>
  11. <a target="_blank" href="https://www.cnblogs.com/register">register</a>
  12. <a target="_blank" href="https://www.cnblogs.com/get_time">get_time</a>
  13. <a target="_blank" href="https://www.cnblogs.com/get_dict">get_dict</a>
  14. <a target="_blank" href="https://www.cnblogs.com/get_mysql">get_mysql</a>
  15. </body>
  16. </html>
复制代码


3.访问django服务端
  1. def home(request):
  2.     with open(r'templates/myhtml06.html','r',encoding='utf8') as f:
  3.         data = f.read()
  4.     return data
复制代码

4.创建app应用
  1. django框架
  2.         大而全 自身携带的功能非常的多 类似于航空母舰
  3.                 缺陷:开发小项目的时候使用该框架有点笨重(大材小用)
  4.    
  5. flask框架
  6.         小而精 自身携带的功能非常的少 类似于特种兵 主要依赖于第三方模块
  7.             缺陷:受限于第三方模块的开发
  8.    
  9. tornado框架
  10.         异步非阻塞 该框架快到可以作为游戏服务器
  11.             缺陷:上手难度是三者最高的
  12. fastapi框架、sanic框架、...
  13.         最近流行的 抽空可以看看
  14. 三大主流web框架特点
  15.     django:
  16.         socket部分用的是别人的                wsgiref模块
  17.         路由与视图函数对应关系(路由匹配)用的是自己的
  18.         模版语法用的是自己的(没有jinja2好用 但是也很方便)
  19.     flask:
  20.         socket部分用的是别人的                werkzeug(内部还是wsgiref模块)
  21.         路由与视图函数对应关系(路由匹配)自己写的
  22.         模版语法用的别人的(jinja2)
  23.     tornado:
  24.         socket部分,路由与视图函数对应关系(路由匹配),模版语法都是自己写的
  25. """
  26. 框架虽然多 但是内部逻辑大差不差 我们重点学习一个即可>>>:django
  27.     如果你是小白切记不要同时学习上述框架
  28. """
复制代码

2.pycharm创建

鼠标点点点即可


修改端口号


修改之后,重新启动,就已经更改了端口号了,这就就可以运行好多个端口号

3. django目录结构

项目同名文件夹
  1. 1.版本问题
  2.     1.X:同步                1.11
  3.     2.X:同步                2.2
  4.     3.X:异步                3.2
  5. ps:你无论使用什么版本都可以 区别不大 2.2
  6. 2.启动注意事项
  7.     1.计算机名称尽量不要有中文
  8.     2.项目中所有的py文件名尽量不要用中文
  9.     3.不同版本的python解释器配合不同版本的django 会有一些报错
  10.         仔细查找一下报错信息 里面会提示你是哪个py文件里面的代码出错
  11.        找到那一行代码 把逗号删除即可
  12.             widgets.py  152  
  13.     4.一个pycharm窗口只允许有一个项目 不要做项目的嵌套
  14. 3.验证django是否下载成功
  15.     cmd终端输入django-admin
复制代码
manage.py
  1. 在pycharm窗口只能有一个django在运行状态,如果多开永远只有第一个在运行,且一个pycharm窗口就是一个项目,不要在窗口下面的子文件夹创建项目,不要和其他项目并列。
复制代码
templates文件夹
  1. 使用中文名极容易出现莫名其妙的报错,使用拼音也会显得非常不专业
复制代码
应用名文件夹(可以有多个)
  1. D:\>django-admin startproject mysite
复制代码
db.sqlite3
  1. 1.先切换到项目目录下
  2.     cd 项目名
  3. 2.执行启动目录
  4.     python manage.py runserver ip:port
复制代码
核心目录结构
  1. 浏览器直接访问
复制代码
django小白必会三板斧
  1. django框架类似于是一个空壳子 给你提供所需的资源
  2. 至于到底要写哪些功能 需要通过创建app来划分
  3.     eg:django初始项目可以看成是一所大学
  4.        app就相当于是大学里面的各个学院
  5. python manage.py startapp 应用名
复制代码
1.django自带了一个功能:admin


2.创建功能

HttpResponse直接返回字符串类型的数据

urls代码
  1. __init__.py          很少用 主要做一些冷门配置
  2.        settings.py    项目配置文件
  3.        urls.py                   对应关系(目前简单的理解:网址后缀跟函数名)
  4.        wsgi.py                  django服务 基本不用
复制代码
views代码
  1. django入口文件
复制代码


render用于返回html页面 并且支持模板语法

templates环境变量问题

views代码
  1. django入口文件def func(request):    return render(request,'func.html')
复制代码
urls代码
  1. migrations文件夹  orm相关(数据库打交道的记录)
  2. __init__.py          很少用 主要做一些冷门配置
  3. admin.py                 django自带的后台管理
  4. apps.py                        创建应用之后用于应用的注册
  5. models.py                存储与数据库表相关的类
  6. tests.py                        自带的测试文件
  7. views.py                 存储业务相关的逻辑代码(函数、类)
复制代码
html代码
  1. 自带的小型数据库
复制代码

redirect主要用于页面重定向

urls代码
  1. urls.py                路由层
  2. views.py        视图层
  3. templates        模板层
  4. models.py        模型层
复制代码
views代码
  1. django入口文件def func(request):    user_dict = {'name': 'jason', 'pwd': 123}    return render(request, 'func.html', {'data': user_dict})def login(request):    return redirect('http://www.baidu.com/')
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表