Web框架和Django框架

Web框架和Django框架

  • Web框架

    1.web框架的本质

    2.纯手撸web框架

    3.基于wsgiref模块搭建web框架

    4.动静态页面

    5.jinja2模板语法

    6.python主流web框架

  • Django框架

    1.Django框架简介

    2.Django基本操作命令

    3.命令行与pycharm操作的区别

    4.Django目录结构

    5.Django小白必会三板斧

Web框架

web框架本质

  • web的本质

    web框架的本质就是一个功能强大的socket服务端,浏览器可以视为拥有可视化界面的socket客户端

    二者通过网络请求,实现数据交换

    web框架就是将前端与数据库做出整合

  • 前端界面、web框架、数据库三者的关系

    前端(客户端)<> web框架 <> 数据库

纯手撸web框架

  • 手撸框架的步骤以及具备知识点

    1.socket服务端代码

    2.使用HTTP协议将服务端代码与浏览器相连接

    3.根据网址的后缀的不同请求不同的内容

    4.请求方式

    ​ 请求方式有两种,分别是GET和POST

    ​ GET:向服务端索要数据

    ​ POST:向服务端提交数据

    5.请求数据的后缀名

    ​ 可利用编译后的客户端代码,来获取所接受的全部内容(该内容是字符串的形式)

    利用分割的方法取出网址的后缀名。然后使用if判断传递给客户端所展示的内容

    ​ target_url = data.decode('utf8').split(' ')[1]

    6.纯手撸web代码的缺陷

    ​ 1.socket代码重复率太大

    ​ 2.针对请求数据格式的处理复杂,使用if判断过多

    ​ 3.针对不同网址后缀的匹配方式过与麻烦

  • 手撸框架

    import socket
    
    server = socket.socket()  # TCP协议
    server.bind(('192.168.1.1', 8080)) # IP协议 PORT协议
    server.listen(5)  #连接池
    
    
    while True:
        sock, address = server.accept()
        data = sock.recv(1024)
        sock.send(b'HTTP/1.1 200 OK\r\n\r\n')
        # print(data.decode('utf8'))  # 从字符串中截取出需要的内容
        target_url = data.decode('utf8').split(' ')[1]  # / /index /login /reg /xxx
        if target_url == '/index':
            sock.send(b'index view')
        elif target_url == '/login':
            sock.send(b'login view')
        elif target_url == '/reg':
            sock.send(b'reg view')
        else:
            sock.send(b'404 error')
    

基于wsgiref模块搭建web框架

wsgiref内部封装了socket代码和对请求数据的处理

  • 基于wsgiref模块的搭建代码

    from wsgiref.simple_server import make_server
    
    
    def run(request, response):
        """
        :param request: 请求数据
        :param response: 响应数据
        :return: 返回给客户端的数据
        """
        print(request)  # 自动将请求数据全部处理成字典k:v键值对形式
        response('200 OK', [])  # 固定代码 无需掌握
        return [b'hello big baby']
    
    
    if __name__ == '__main__':
        server = make_server('127.0.0.1', 8080, run)  # 任何访问127.0.0.1:8080的请求都会给第三个参数加括号调用
        server.serve_forever()  # 永久启动
    
  • wsgiref模块相比与socket创建的web框架的优化

    ​ 1.wsgiref优化了使用socket代码重复编写

    ​ 2.优化了数据格式请求的处理复杂且重复的操作

    ​ 自动将请求的数据处理成字典的形式,取值时直接可用字典的取值方法取值

  • 根据不同的网址后缀返回不同的内容

    1.将其函数化,先从大字典中查找出记录网址后缀的键值对

    2.针对面条版的代码首先应该考虑封装成函数

    def index(request):
        return 'index'
    def login(request):
        return 'login'
    def register(request):
        return 'register'
    def error(request):
        return '404 error'
    urls = (
        ('/index', index),
        ('/login', login),
        ('/register', register),
    )	
    

    3.将其模块化——根据功能的不同划分到不同的py文件中

    • 主要功能的划分

      文件 功能
      url.py 对应关系
      views.py 功能函数
      start.py 启动文件
      templates 文件夹 存储html

动静态页面

  • 动静态页面的区别

    页面 区别
    动态网页 页面上的数据不是全部写死的,部分是动态获取的(后端传入)
    静态网页 页面上的数据直接写死,要想改变只能改变源码

jinja2模块

jinja2能够让我们在html文件内使用类似于后端的语法来操作各种数据类型

  • 添加jinja2第三方模块

    pip38 install jinja2

  • 在jinja2模块下将字典数据展示

    view
    from jinja2 import Template
    def get_dict(request):
        user_dict = {'name': 'jason', 'pwd': 123, 'hobby': ['read', 'run', 'music']}
        with open(r'templates/myhtml04.html','r',encoding='utf8') as f:
            data = f.read()
        temp = Template(data)
        res = temp.render(data=user_dict)  # 将字典传递给html页面 页面上通过data即可获取(data仅仅是一个变量名)
        return res
    

jinja2模块语法

<h1>{{ data }}</h1>  	# 获取view视图获取的字典数据
# 获取字典键的三种表达方式
<h1>{{ data['name'] }}</h1>    	 
<h1>{{ data.get('pwd') }}</h1>
<h1>{{ data.hobby }}</h1> 
# 使用for循环获取的语法
{%for i in data%}   {% endfor %}


{% for user in user_data %}
    <tr>
        <td>{{ user.id }}</td>
        <td>{{ user.name }}</td>
        <td>{{ user.age }}</td>
    </tr>
{% endfor %}

python主流web框架语法

  • python主流框架分别是什么,又有那些缺陷

    web框架 概括 缺陷
    django框架 大而全 自身携带的功能非常的多 开发小项目时,使用该框架大材小用
    flask框架 小而精 自身携带的功能非常的少
    主要依赖于第三方模块
    受限于第三方模块的开发
    tornado框架 异步非阻塞 该框架快到可以作为游戏服务器 上手难度是三者最高的
    fastapi框架、sanic框架 当前最近流行的

    重点是前三种框架

Django框架

Django框架的简介

  • 版本问题

    版本 状态 维护的具体版本 维护年限
    1.x 同步 1.11版本 2018-2020
    2.x 同步 2.2版本 2020-2022
    3.x 异步 3.2版本 2022-2024

    你无论使用什么版本都可以 区别不大

  • 启动的注意事项

    ​ 1.计算机名称尽量不要有中文
    2.项目中所有的py文件名尽量不要用中文
    3.不同版本的python解释器配合不同版本的django 会有一些报错
    ​ 仔细查找一下报错信息 里面会提示你是哪个py文件里面的代码出错
    ​ 找到那一行代码 把逗号删除即可
    ​ widgets.py 152
    4.一个pycharm窗口只允许有一个项目 不要做项目的嵌套

  • 验证django是否下载成功

    cmd终端输入django-admin

Django的基本操作命令

  • 命令行操作

    1. 创建django项目

      ​ django-admin startproject 项目名

    2. 启动django项目

      ​ 1.先切换到项目目录下

      ​ cd 项目名

      ​ 2.执行启动目录

      python38 manage.py runserver ip:port

    3. 访问django服务端

      ​ 浏览器直接访问

    4. 创建app应用

      python38 manage.py startapp 应用名

      django框架类似于是一个空壳子 给你提供所需的资源
      至于到底要写哪些功能 需要通过创建app来划分
      eg:django初始项目可以看成是一所大学
      app就相当于是大学里面的各个学院

  • pycharm操作

    ​ 鼠标点点点即可

    在启动django项目的时候 一定要确保一个端口只有一个项目

命令行与pycharm操作的区别

1.命令行不会自动创建templates文件夹
2.命令行不会在配置文件编写关于templates文件夹的配置
'DIRS': [os.path.join(BASE_DIR, 'templates')]
3.pycharm自动创建的第一个应用会自动注册到配置文件中
4.针对db.sqlite3文件不用去在乎它有没有创建 只要运行了django会自动出来

Django目录结构

  • Django目录分为与项目同名的文件夹、应用名文件夹、自带了一个小型的数据库——db.sqlite3

  • 与django同名文件夹下的文件

    项目同名文件夹 作用
    init.py 很少用 主要做一些冷门配置
    settings.py 项目配置文件
    urls.py 对应关系(目前简单的理解:网址后缀跟函数名)
    wsgi.py django服务 基本不用
    manage.py django入口文件
    templates文件夹 存储项目所需的html文件
  • 应用名文件夹(可以有多个)下的文件

    应用名文件夹(可以有多个) 作用
    migrations文件夹 orm相关(数据库打交道的记录)
    init.py 很少用 主要做一些冷门配置
    admin.py django自带的后台管理
    apps.py 创建应用之后用于应用的注册
    models.py 存储与数据库表相关的类
    tests.py 自带的测试文件
    views.py 存储业务相关的逻辑代码(函数、类)
  • django重点会分成四层

    文件 分层
    urls.py 路由层
    view.py 试图层
    templates文件夹 模板层
    models.py 模型层

Django小白必会三板斧

  • HttpResponse

    ​ 主要用于直接返回字符串类型的数据

    def index(request):
        return HttpResponse('你好啊 我是django2.2.22版本')
    
  • render

    ​ 主要用于返回html页面 并且支持模板语法

    def func(request):
        user_dict = {'name': 'jason', 'pwd': 123}
        return render(request, 'func.html', {'data': user_dict})
    
    
  • redirect

    ​ 主要用于页面重定向

    def login(request):
        # return redirect('https://www.baidu.com/')
        return redirect('/index/')
    

    ​ 重定向就是本应该由A页面跳转到B页面,结果跳转到C页面

posted @ 2022-08-30 20:59  Nirvana*  阅读(123)  评论(0)    收藏  举报