Code前端首页关于Code前端联系我们

Web框架管理流程及Django简介

terry 2年前 (2023-09-24) 阅读数 55 #后端开发

纯手工Web框架

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

1.socket服务端代码
2.HTTP协议
3.根据网址后缀不同请求不同的内容
4.请求方式
    GET:朝服务端索要数据
    POST:朝服务端提交数据
5.从请求数据格式中筛选出用户输入的网址后缀
    target_url = data.decode('utf8').split(' ')[1]
6.代码的缺陷
    1.socket代码重复编写,反复造轮子
    2.针对请求数据格式的处理复杂且重复(切片加索引)
    3.针对不同网址后缀的匹配方法过于lowB   
    
import socket

server = socket.socket()  # TCP协议
server.bind(('127.0.0.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代码和对应请求数据的处理

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()  # 永久启动

1.wsgiref模块解决了两个问题:
    socket代码重复编写,反复造轮子
    针对请求数据格式的处理复杂且重复(切片加索引)
2.思考如何再次实现根据不同的网址后缀(路由)返回不同的内容(函数化)
    先从大字典中找出记录路由的键值对
    1.不推荐使用连续的多个if判断
    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文件中各个代码块功能的不同划分到不同的py文件(模块化)
	urls.py				对应关系
	views.py			功能函数
	start.py			启动脚本
        templates文件夹	                存储html文件

动态和静态网页


动态网页:页面上数据不是完全写死的,有些是动态获取的(后端传入)
静态网页:网页上数据直接写死,想要修改只能动源码

实际需求:
    后端代码将需要的数据发送给前端页面,由前端展示
    1.字符串替换
    2.将字典数据传递给HTML页面并且想要在页面上操作字典数据(目前无法实现,需要借助模块)

jinja2模块

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

1.socket服务端代码
2.HTTP协议
3.根据网址后缀不同请求不同的内容
4.请求方式
    GET:朝服务端索要数据
    POST:朝服务端提交数据
5.从请求数据格式中筛选出用户输入的网址后缀
    target_url = data.decode('utf8').split(' ')[1]
6.代码的缺陷
    1.socket代码重复编写,反复造轮子
    2.针对请求数据格式的处理复杂且重复(切片加索引)
    3.针对不同网址后缀的匹配方法过于lowB   
    
import socket

server = socket.socket()  # TCP协议
server.bind(('127.0.0.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') 

jinja2模块

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

pip install jinja2

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

ythonx

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

pip install jinja2

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

Web框架

django框架
    特点:大而全,自身携带的功能很多,类似于航空母舰
    缺点:开发小项目时过于臃肿(杀鸡焉用牛刀)

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

tornado框架
    特点:异步非阻塞,该框架快到可以作为游戏服务器
    缺陷:上手难度较高

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

Django框架介绍

1.版本问题
    1.X: 同步			1.1.11
    2.x: 同步			2.2.22
    3.x: 支持异步	        3.2
我们这里用的是 2.2.22版本

2.启动注意事项
    1.计算机名称尽量不要有中文名
    2.项目中的所有py文件尽量不要有中文
    3.不同版本的Python解释器配合不同的django会有报错 
        一般是widgets.py文件的第152行 把末尾的逗号删除即可   
    4.一个pycharm窗口只允许有一个项目 不要做项目的嵌套

3.验证Django是否安装成功
    cmd终端输入django-admin  

web框架推导过程与Django简单介绍

Django基本使用说明

1.创建django项目
    django-admin startproject 项目名
2.启动django项目
    1.先切换到项目名称下
        cd 项目目录
    2.执行启动命令
        python manage.py runserver ip:port(不写默认本机端口)
3.访问django服务器
    浏览器输入地址直接访问
4.创建app应用
    python manage.py startapp 应用名
    """
    django框架类似于一个空壳子 给你提供所需的资源
    至于需要写哪些功能,需要创建app来划分
        eg:登录、购物、转账...一个功能就是一个app
    """

使用Django的命令行与pycharm的区别

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

Django项目目录结构

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				存储业务相关的逻辑代码
	db.sqlite3					自带的小型数据库


几个相对更重要的文件
urls.py		路由层
views.py	视图层
templates	模板层
models.py       模型层

Django♿❀❓

(使用django展示MySQL数据到前端页面)

views.py部分代码:

def get_userinfo(request):
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        password='',
        database='day55',
        charset='utf8',
        autocommit=True
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql1 = 'select * from userinfo'
    cursor.execute(sql1)
    user_info = cursor.fetchall()
    return render(request, 'getUserinfo.html', {'userinfo': user_info})




getUserinfo部分代码:

<table class="table table-bordered table-striped table-hover table-condensed">
    <thead>
    <tr>
        <th>序号</th>
        <th>姓名</th>
        <th>年龄</th>
    </tr>
    </thead>
    <tbody>
    {% for user in userinfo %}
    <tr>
        <td>{{ user.id }}</td>
        <td>{{ user.name }}</td>
        <td>{{ user.age }}</td>
    </tr>
    {% endfor %}
    </tbody>
</table>

作者:爱新觉逻辑之星
来源:稀土掘金

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门