• django之day01


    一:纯手撸web框架(思路)

    1.什么是web框架?
    • 基于互联网的web服务端

    2.请求方式都有哪几种?

    • 1.post:向服务端提交数据
    • 2.get:向服务端索要数据
    2.代码
    import socket
    
    server = socket.socket()
    server.bind(('127.0.0.1', 8080))
    server.listen(5)
    
    while True:
        sock, addr = 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]
        print(target_url)  # / /index /register
    
        if target_url == '/index':
            sock.send(b'index')
        elif target_url == '/register':
            sock.send(b'register')
        else:
            sock.send(b'404 error')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    3.上面代码存在的缺陷
    • 1.socket代码冗余
    • 2.对请求数据格式的处理复杂且重复
    • 3.不同的后缀匹配相应网址的方法太LOW

    二:基于wsgiref模块写web框架(思路),以及代码的优化

    1.目的:
    from wsgiref.simple_server import make_server
    from urls import urls
    from views import *
    
    
    def run(request, response):
        """
        :param request: 请求数据
        :param response: 响应数据
        :return: 返回给客户端的数据
        """
        response('200 OK', [])  # 固定代码
        target_path = request.get('PATH_INFO')
        func_name = None
        for url_tuple in urls:
            if url_tuple[0] == target_path:
                func_name = url_tuple[1]
                break  # 
        if func_name:
            res = func_name(request)
        else:
            res = error(request)
        return [res.encode('utf8')]
    
    
    if __name__ == '__main__':
        server = make_server('127.0.0.1', 8080, run)
        server.serve_forever()  # 永久启动
    
    • 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
    • 27
    • 28
    • urls.py文件
    from views import *
    urls = (
        ('/home', home),
        ('/index', index),
        ('/login', login),
        ('/register', register),
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • views.py文件
    def index(request):
        return 'index'
    def login(request):
        return 'login'
    def register(request):
        return 'register'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    2.解决了哪些问题?
    • 1.socket代码冗余
    • 2.对请求数据格式的处理复杂且重复

    三:如何使用jinja2模块

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

    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) 
        return res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    四:动静态网页

    1.动态网页:页面上的数据是从后端传入的

    2.静态网页:页面上的数据是固定写好的,要修改只能修改源码

    五:模板语法

    <h1>{{ data }}</h1>
    <h1>{{ data['name'] }}</h1>
    <h1>{{ data.get('pwd') }}</h1>
    <h1>{{ data.hobby }}</h1> 
    
    {% for user in user_data %}
        <tr>
            <td>{{ user.id }}</td>
            <td>{{ user.name }}</td>
            <td>{{ user.age }}</td>
        </tr>
    {% endfor %}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    六:Python主流的web框架

    1.django框架

    ​ 大而全 自身携带的功能非常的多 类似于航空母舰
    ​ 缺陷:开发小项目的时候使用该框架有点笨重(大材小用)

    2.flask框架

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

    3.tornado框架

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

    4.fastapi框架、sanic框架、…

    ​ 最近流行的

    七:django框架简介

    1.版本:
    • 1.x 同步 1.1
    • 2.x 同步 2.2
    • 3.x 同步 3.2

    八:django的基本操作命令

    1.创建django项目:django-admin startproject 项目名称

    2.启动django项目:

    • 1.先切换到项目目录下:cd 项目目录
    • 2.执行这个命令:python38 manage.py runserver ip:port
    • 3.创建app: python38 manage.py startapp 应用名称

    九:命令行创建和pycharm创建的django项目的区别

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

    十:django的目录结构

      1. settings.py 配置文件
      2. urls.py 路由层
      3. 3.wsgi.py django服务 基本不用
      4. manage.py 入口文件
      5. templates文件夹 模板层
      6. migrations文件夹 orm相关的数据库操作记录
      7. admin.py django自带的后台管理
      8. models.py 模型层
      9. tests.py 自带的测试文件
      10. views.py 视图层
      11. db.sqlite3 自带的小型数据库

    十一:小白必会3板斧

      1. HttpResponse 返回字符串类型的数据
    • def index(request):
          return HttpResponse('这是一个视图函数')
      
      • 1
      • 2
      1. render 返回html页面,支持模板语法
    • def index(request):
          return render(request, 'index.html')
      
      • 1
      • 2
      1. redirect 重定向
    • def index(request):
          return redirect('https://www.baidu.com')
      
      • 1
      • 2

    作业:

    路由层

    urlpatterns = [
        path('show_info/', views.show_info),
    ]
    
    • 1
    • 2
    • 3

    视图层

    from jinja2 import Template
    import pymysql
    def show_info(request):
        conn = pymysql.connect(
            host='127.0.0.1',
            port=3306,
            user='root',
            password='888',
            database='dj01',
            charset='utf8',
            autocommit=True
        )
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        sql = 'select * from userinfo'
        cursor.execute(sql)
        user_data = cursor.fetchall()
        with open(r'templates/1.html', 'r', encoding='utf8') as f:
            data = f.read()
        temp = Template(data)
        res = temp.render(user_data=user_data)
        return HttpResponse(res)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    html文件

    <div class="container">
            <div class="row">
                <h1 class="text-center">数据展示</h1>
                <div class="col-md-8 col-md-offset-2">
                    <table class="table table-hover table-striped">
                        <thead>
                            <tr>
                                <th>主键</th>
                                <th>姓名</th>
                                <th>年龄</th>
                                <th>爱好</th>
                            </tr>
                        </thead>
                        <tbody>
                            {% for user in user_data %}
                                <tr>
                                    <td>{{user.id}}</td>
                                    <td>{{user.name}}</td>
                                    <td>{{user.age}}</td>
                                    <td>{{user.hobby}}</td>
                                </tr>
                            {% endfor %}
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    
    • 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
    • 27

    结果

    在这里插入图片描述

  • 相关阅读:
    我的世界Minecraft基岩版开服服务器教程(Windows)开服器开服包下载开服网站服务器要多少钱开服核心开服端下载
    LINUX网络FTP服务
    SD NAND 的 SDIO在STM32上的应用详解(中篇)
    Spring Cloud Gateway快速入门(一)——网关简介
    洛谷——P1164 小A点菜
    ELF和静态链接:为什么程序无法同时在Linux和Windows下运行?
    python基于django仓库进销存管理系统 计算机毕业设计
    数据发布!智驾域控前装搭载同比增长90.99%,哪些企业在领跑市场
    还在拼冗长的WhereIf吗?100行代码解放这个操作
    Mac电脑idea中配置nodejs前端环境
  • 原文地址:https://blog.csdn.net/Yydsaoligei/article/details/126608752