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

2022-09-1811:02:26后端程序开发Comments870 views字数 4365阅读模式

纯手撸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模块

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

模板语法

<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 %}

python主流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简单介绍文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/27821.html

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
    """

命令行与pycharm操作django的区别

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小白必会三板斧

1.HttpResponse
	主要用于直接返回字符串类型的数据
	return HttpResponse('404 NOT FOUND')

2.render
	主要用于返回html页面 并且支持模板语法
	return render(request, 'getUserinfo.html', {'userinfo': user_info})

3.redirect
	主要用于页面重定向
	return redirect('www.baidu.com')

作业

(使用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>

作者:爱新觉罗吉星
来源:稀土掘金文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/27821.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/27821.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定