• Day55 web框架 入门 Django


    Day55 web框架 入门 Django

    1、纯手撸web框架

    web框架可以简单的理解为是基于互联网web服务端 >>>:socket服务端

    TCP服务端

    import socket
    
    server=socket.socket()
    
    server.bind(('127.0.0.1',8080))
    
    server.listen(3)
    while True:
        sock,address=server.accept()
    
        sock.send(bytes('hello','utf8'))
        res=sock.recv(1024)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    基于TCP协议 HTTP协议服务端

    import socket
    
    server=socket.socket()
    
    server.bind(('127.0.0.1',8080))
    
    server.listen(3)
    while True:
        sock,address=server.accept()
    
        sock.send(bytes(b'HTTP/1.1 200 OK\r\n\r\nhello','utf8'))
        res=sock.recv(1024)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    推导 通过 网址不同请求不同的内容

    • GET
      • 朝服务端索要数据
    • POST
      • 朝服务端提交数据

    从请求数据格式中筛选出用户输入的网址后缀

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

    代码的缺陷

    1. socket代码重复编写
    2. 针对请求数据格式的处理复杂且重复
    3. 针对不同网址后缀的匹配方式过去lowB
    import socket
    
    server = socket.socket()
    server.bind(('127.0.0.1',8080))
    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')
        target_url = data.decode('utf8').split(' ')[1]
        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 reeor')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2、基于wsgiref

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

    wsgiref 模块解决了 两个问题
    socket 代码重复编写问题
    针对请求数据格式的处理复杂且重复

    from wsgiref.simple_server import make_server
    
    
    def run(request, response):
        """
        :param request: 请求数据
        :param response: 响应数据
        :return: 返回客户端数据
        """
        print(request)  # Zion给将 请求数据全部处理成字典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()  # 永久启动
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    思考如何再次实现根据不同的网址后缀返回不同的内容
    先从字典中查找出记录网址后缀的键值对

    1. 不推荐使用if判断
    2. 针对面条版的代码首先应该考虑封装成函数
    def index(reuest):
        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),
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    根据py文件中功能的不同划分到不同的py文件(模块化)

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

    2.1、动静态网页

    动态网页
    页面上的数据不是全部写死的 有些是动态获取(后端传入)

    静态网页
    页面上的数据直接写死的 要想改变只能修改源码

    2.2、新需求

    后端代码获取当前时间 然后让前端页面展示

    1. 字符串替换

    2. 将字典数据传递给html页面并且想要在页面上操作字典数据

      我们之前所学 无法自己实现>>>:在html页面上使用类似于后端的语法操作数据

    3、jinja2模块

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

    from jinja2 import Template
    def get_dict(request):
        user_dict = {'name':'jason','pwd':123,'hobby':['read','run','music']}
        with open(r'templates/myhtml104.html','r',encoding='utf8') as f:
            data = f.read()
        temp = Template(data)
        res = temp.render(data=user_dict) #将字典传递给html页面 页面上通过data即可获取
        return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.1、模板语法

    <h1>{{data}}h1>  以标题一炸死你hi字典
    <h1>
        {{data['name']}}  
    h1> 获取字典 键name
    
    <h1>
        {{data.get('pwd')}}
    h1>  获取键pwd
    
    <h1>
        {{data.hoby}}
    h1> 获取键hoby
    
    {% for uer in user_data %}
    	<tr>
    		<td>{{user.id}}td>
            <td>{{user.name}}td>
            <td>{{user.age}}td>
    	tr>
    {% endfor %}  jinjia2 中for循环 语法
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    4、python主流web框架

    django框架
    大而全 自身携带的功能非常的多 类似于航空母舰

    flask框架
    小而精 自身携带的功能非常的少 类似于特种兵 主要依赖于第三方模块
    缺陷:受限于第三方模块的开发

    tornado框架
    一步非阻塞 该框架快到可以作为游戏服务器
    缺陷:上手难度是三者最高的

    fastapi框架、sanic框架
    最近比较流行的

    框架虽多 但是内部逻辑大差不差 我们重点学习一个即可>>>:django
    如果你是小白切记不要同时学习上述框架

    5、django框架简介

    版本问题
    1.X:同步
    2.X:同步
    3.X:异步
    你无论使用上面版本都可以 区别不大 2.2

    启动注意事项

    1. 计算机名称 尽量不要有中文

    2. 项目中所有的py文件名尽量不要用中文

    3. 不同版本的python解释器配合不同版本的django 会有一些报错

      仔细查找一下报错信息 里面会提示你是哪个py文件里面的代码出错

      找到那一行代码 把逗号删除即可

      ​ widgets.py 152

    4. 一个pycharm 窗口只允许有一个项目 不要坐项目的嵌套

    验证django 是否 下载成功
    cmd终端输入django-admin

    6、django 基本操作命令

    命令行操作

    1. 操作django项目

      django-admin startproject 项目名
      
      • 1
    2. 启动django项目

      1. 先切换到项目目录下

        cd 项目名

      2. 执行启动目录

        pytho38 manage.py runserver ip:port

    3. 访问django服务端

      浏览器直接访问

    4. 创建app应用

      python38 manage.py startapp 应用名
      
      • 1

      django框架类似于是一个空壳子 给你提供所需的资源

      至于到底要写哪些功能 需要通过创建app来划分

      eg:django 初始项目可以看成是一所大学

      app就相当于是大学里面的各个学员

    parcharm操作
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QVD2eH34-1661869795326)(C:\Users\82576\AppData\Roaming\Typora\typora-user-images\image-20220830205210895.png)]

    7、命令行与pycharm操作的区别

    命令行不会自动创建templates文件夹

    命令行不会再配置文件编写关于templates 文件夹配置

    'DIRS':[os.path.join(BASE_DIR,'templates')]
    
    • 1

    pycharm 自动创建的第一个应用会自动注册到配置文件中

    针对db.sqlites3 文件不用去在乎它没有创建 只要运行了django 会自动出来

    8、django目录结构

    8.1、项目同名文件夹

    文件名主要作用
    __init__.py很少用 主要做一些冷门的配置
    settings.py项目配置文件
    urls.py对应关系
    wsgi.pydjango服务 基本不用
    manage.pydjango入口文件

    8.2、templates 文件夹

    存储项目所需的html文件

    8.3、应用文件夹(可以有多个)

    文件名作用
    migations文件夹orm相关(数据库打交道的记录)
    __init__.py很少用 主要做一些冷门配置
    admin.pydjango自带的后台管理
    apps.py创建应用之后用于应用的注册
    models.py存储与数据库 表 相关的类
    tests.py自带测试文件
    tests.py自带的测试文件
    views.py存储业务相关的逻辑代码(函数、类)
    db.sqlite3自带的小型数据库

    特殊核心 文件

    urls.py
    路由层:记录对应关系

    views.py
    视图层:核心逻辑层(

    templates
    模板层:专门存html文件

    models.py
    模型层:存储与数据库 表 相关的类

    9、django小白必会三板斧

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

    def index(request):
        return HttpResponse('heillo django2222')
    
    • 1
    • 2

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

    def func(request):
        user_dict={'name':'kk','pwd':'123'}
        return render(request,'a.html',{'data':user_dict})
    
    • 1
    • 2
    • 3

    redirect
    主要用于页面重定向

    def login(request):
        return redirect('https://www.baidu.com')
    
    • 1
    • 2

    作业

    def mysql(request):
        import pymysql
        conn=pymysql.connect(
            host='127.0.0.1',
            port=3306,
            user='root',
            password='123',
            database='html_db',
            charset='utf8',
            autocommit=True
        )
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        sql = 'select * from html1'
        cursor.execute(sql)
        user_data = cursor.fetchall()
        return render(request,'mysql.html',{'user_data':user_data})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    mysql.html

    <body>
    <div class="container">
        <div class="row">div>
        <h1 class="text-center">用户信息h1>
        <table class="table table-bordered table-hover">
            <thead>
                <tr class="info">
                    <th>编号th>
                    <th>用户th>
                    <th>密码th>
                tr>
            thead>
            <tbody>
            {% for user_list in user_data %}
                <tr class="danger">
                    <td>{{ user_list.id }}td>
                    <td>{{ user_list.name }}td>
                    <td>{{ user_list.pwd }}td>
                tr>
            {% endfor %}
            tbody>
        table>
    
    
    div>
    body>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nl8YI2bS-1661869795328)(C:\Users\82576\AppData\Roaming\Typora\typora-user-images\image-20220830222453240.png)]

  • 相关阅读:
    JAVA 学习笔记 2年经验
    【校招VIP】java开源框架之Zookeeper
    1.4 w字,25 张图让你彻底掌握分布式事务原理
    泛微OA——ecology 9建立自定义Java接口并部署到对应节点
    【技巧】如何快速给每张PPT同时插入不同的图片?
    专注区块链底层技术突破,“复杂美”用技术开源推动产业未来
    Flink sql 实现 -connection-clickhouse的 source和 sink
    python模块hmac,hmac哈希算法库
    第6章Linux实操篇-开机、重启和用户登录注销
    代码随想录 - Day33 - 回溯:切割问题,子集问题
  • 原文地址:https://blog.csdn.net/weixin_71967396/article/details/126614102