web主流框架

内容概要

  • 手写简易版本web框架
  • 借助于wsgiref模块
  • 动静态网页
  • jinja2模板语法
  • 前端、web框架、数据库三种结合
  • Python主流web框架
  • django框架

手写简易版本web框架

# 类型转换
	字符串转bytes类型:res = 
        s = 'meng 今天'
        res = bytes(s,'utf8')  # 可以转成二进制类型
    bytes类型转字符串:
    	res1 = str(res,'utf8')
        print(res1)
'''
问题1:代码冗余
问题2:处理http数据繁杂
'''   

import socket

server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)

while True:
    conn, addr = server.accept()
    data = conn.recv(1024)
    data = data.decode('utf8')
    target_url = data.split(' ')[1]
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
    if target_url == '/index':
        conn.send(b'index')
    elif target_url == '/login':
        conn.send(b'login')
    elif target_url == '/admin':
        with open(r'hd.html','rb') as f:
            for line in f:
                conn.send(line)
    else:
        conn.send(b'404 error')

wsgiref模块

from wsgiref.simple_server import make_server

def run(request,response):
    '''
    :param request: 跟请求相关的数据
    :param response: 跟响应相关的数据
    :return: 返回值就是要给前端浏览器的数据
    '''
    response('200 OK',[])
    # print(request)  # 自动帮我们处理了http相关的数据,并组成一个大字典,可以根据key取值。
    target_url = request.get('PATH_INFO')
    if target_url == '/index':
        return [b'index']
    elif target_url == '/login':
        return [b'login']
    elif target_url == '/admin':
        return [b'admin']
    else:
        return [b'404 error']   

if __name__ == '__main__':
    # 监听127.0.0.1:8000.一旦请求立刻将第三个参数加括号调用
    server = make_server('127.0.0.1',8080,run)
    # 启动服务端
    server.serve_forever()

变形优化代码

针对后缀较多的情况 如何更加优化匹配
def register():
    return 'register页面'
urls = [
    ('/index',index),
    ('/login',login),
    ('/reg',register)
]
'''以后新增功能只需要先写一个函数 然后加一组对应关系即可'''

针对同一个py文件内部代码功能繁杂的情况 拆分多个py文件
	views.py		专门用于存放核心业务逻辑
    urls.py			专门用于存放路径对应关系
    templates        专门用于存放html文件
'''以后新增功能只需要views.py写函数 然后urls.py写对应关系即可'''

views.py:存放核心业务逻辑

def index(request):
    with open(r'templates/index.html', 'r', encoding='utf8') as f:
        return f.read()

def login(request):
    return 'login'

def admin(request):
    return 'admin'

def error(request):
    return '404 error'

urls.py:存放路径对应关系

from views import *
urls = [
    ('/index', index),
    ('/login', login),
    ('/admin', admin),
]

wsgiref.py:存放代码逻辑

from wsgiref.simple_server import make_server
from urls import urls
from views import error

def run(request, response):
    response('200 OK', [])
    target_url = request.get('PATH_INFO')  # 取到'/index'
    # 定义一个存储函数名的变量
    func = None
    for url_tuple in urls:  # 相当于取一个个元祖 ('/index',index)
        if target_url == url_tuple[0]:
            func = url_tuple[1]  # 相当于func = index
            break

    # 判断func是否有对应项
    if func:
        res = func(request)
    else:
        res = error(request)
    return [res.encode('utf8')]

if __name__ == '__main__':
    # 监听127.0.0.1:8000.一旦请求立刻将第三个参数加括号调用
    server = make_server('127.0.0.1', 8080, run)
    # 启动服务端
    server.serve_forever()

动静态网页

动静态网页
	动态网页
    	数据不是直接写死在html页面上的 而是动态获取(后端)
    静态网页
    	数据是直接写死在页面上的
 
使用我们自己写的web框架 完成一个动态页面的返回

from datetime import datetime
def time(request):
    # 获取当前时间
    ctime = datetime.now().strftime('%Y-%m-%d %X')
    # 读取httl文件
    with open(r'templates/time.html', 'r', encoding='utf8') as f:
        re_time = f.read()
    # 用替换内置方法来达到让html页面显示当前时间
    re_time = re_time.replace('当前时间:', '当前时间:%s' % ctime)
    return re_time

jinja2模块

该模块提供了"模板语法"
	支持后端给html页面传递数据并且支持后端语法
pip3 install jinja2

# views.py
from jinja2 import Template

name = {'username': 'meng', 'age': 18, 'gender': 'male'}
def user(request):
    with open(r'templates/user.html', 'r', encoding='utf8') as f:
        tom = f.read()
    res = Template(tom)
    temp = res.render({'user': name})
    return temp

# user.html
<body>
<h1>{{user}}</h1>
<h1>{{user['username']}}</h1>
<h1>{{user.get('age')}}</h1>
<h1>{{user.gender}}</h1>
<div>
    {% for key in user%}
    <p>{{user[key]}}</p>
    {%endfor%}
</div>
</body>

python主流web框架

'''千万不要同时学习多个框架!!!'''
django框架
	大而全 内部自带的组件特别特别多 类似于航空母舰
    有时候可能会过于"笨重"
    
flask框架
	小而精 内部几乎没有什么自带的组件 全部依赖于第三方模块 类似于游骑兵
    如果将flask所有的第三方模块集合到一起甚至可以盖过django
    有时候可能会出现第三方模块无法兼容的情况

tornado框架
	异步非阻塞
    """
    同步异步
    	同步:提交任务之后原地等待任务的返回结果 期间不做任何事
    	异步:提交任务之后不原地等待任务返回结果 有结果会通过回调机制反馈
    阻塞非阻塞
    	阻塞:程序被剥夺了CPU执行权限
    	非阻塞:运行态 就绪态
    """
A:socket部分
B:路由匹配
C:模板语法
    
django
	A:不是自己写的 用的wsgiref模块
    B:自己写的
    C:自己写的
flask
	A:不是自己写的 werkzeug(依赖于wsgiref模块)
    B:自己写的
    C:不是自己写的 jinja2
Tornado
	A,B,C全部都是自己写的

    
知识储备:    
    fastapi框架
        异步框架

django框架

# 1.计算机名称里面最好不要含有中文
# 2.项目名和py文件名尽量也不要使用中文

django版本问题
	django1.X
    django2.X
    django3.X
"""
3.X支持异步(但是目前写的不好)
1.X 2.X 3.X在使用上几乎没有太大差距

针对django版本我们以1.11.11为学习对象

pip3 install django==1.11.11
"""

验证django是否下载完毕,cmd窗口敲下面命令
	django-admin

django基本使用

1、命令行创建Django
	1.创建django项目
    	django-admin startproject 项目名
    2.如何运行django项目
    	切到项目目录下
        	cd 项目名
        python3 manage.py runserver
			# 可能会报错 需要删除widgets.py 152行逗号
             # 路径:D:\Python39\Lib\site-packages\django\contrib\admin\widgets.py
             '%s=%s' % (k, v) for k, v in params.items(),  # 删除逗号,不然会报错
    3.创建app
    	python3 manage.py startapp app名字
    # 命令行中会少一个配置和templates文件夹,需要自己创建和修改
    # 修改配置:E:\student\python student\djanpy\djanpy\settings.py中
    TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],   # 添加 os.path.join(BASE_DIR, 'templates') 配置
"""
命令行创建不会自动创建templates文件夹 并且配置文件中也不会配置
需要自己创建文件夹并配置
	os.path.join(BASE_DIR, 'templates')
"""

2、pycharm创建Django
        find ----->New project---->django
        # pycharm不用修改配置

什么是app

django相当于一所大学(空壳子)
	app相当于大学里面的各个学院(功能主题)
posted @ 2021-11-21 14:37  迷恋~以成伤  阅读(50)  评论(0)    收藏  举报