django 1/手撸web框架/推演/django安装,使用注意事项/

  • 手撸web框架
  • 基于wsgiref模块
  • 动静态网页
  • jinja2模块
  • 模块语法
  • python主流框架
  • django框架简介
  • django基本操作命令
  • 命令行与pycharm操作区别
  • django目录结构
  • django小白必会三板斧

web框架

用于进行Web开发的一套软件架构,简单理解基于互联网的web服务端>>>socket服务端


推演:

第一次:苗条版,纯手撸框架

第二次:封装函数版(wsgiref)

第三次:模块版。将py文件功能不同的文件划分到不同的py文件中


第一版:面条版

socket服务端代码

1.socket服务端代码

2.http协议
3.根据网址后缀的不同请求不同的内容
4.请求方式 get或者post (get 朝服务器端索要数据 post朝服务端提交数据)
5.从请求数据格式中筛选出用户输入的网址后缀
target_url = date.decode('utf8').split('')[1]

import socket
server = socket.socket()
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')
        target_url = data.decode('utf8').split(' ')[1]
        if target_url  == '/index':
            sock.send(b'index view')
        elif target_url == '/reg':
            sock.send(b'reg view')
        elif target_url == '/reg':
            sock.send(b'reg view')
        else:
            sock.send(b'404 error')

总结

1.socket 代码重复编写造轮子
2.针对请求数据格式的处理复杂且重复
3.针对HTTP请求数据没有完善的处理方式(目前只能定向切割)
4.针对不同网址后缀的匹配方式过于繁琐

image

第二版函数版

基于wsgiref模块

wsgiref模块

Web服务器网关接口(WSGI)是Web服务器软件和用Python编
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', 8081, run)  # 任何访问127.0.0.1:8080的请求都会给第三个参数参加括号调用
    server.serve_forever()  # 永久起动

image

总结

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

2.思考如何再次实现根据不同的网址后缀返回不同的内容(函数化)
​ 先从大字典中查找出记录网址后缀的键值对
​ 1.不推荐使用连续的多个if判断
​ 2.针对面条版的代码首先应该考虑封装成函数

推演最终优化

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

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

start.py

固定模板不动,start.py文件中调用了wsgiref模块

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')  # /login
    func_name = None
    for url_tuple in urls:  # ('/index',index)   ('/login',login)
        if url_tuple[0] == target_path:
            func_name = url_tuple[1]  # 先存储匹配到的函数名
            break  # 一旦匹配到了内容就立刻结束for循环 没有必要继续往下核验了
    # for循环结束之后还需要判断func_name是不是为None(有可能没有匹配上)
    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', 8081, run)  # 任何访问127.0.0.1:8080的请求都会给第三个参数加括号调用
    server.serve_forever()  # 永久启动

views.py

新增功能都在此处py文件中

#
from jinja2 import Template
def index(request):
    return 'index'

def login(request):
    return 'login'

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


def get_dict(request):
    user_dict = {'name': 'jason', 'pwd': 123, 'hobby': ['read', 'run', 'music']}
    with open(r'myhtml04.html', 'r', encoding='utf8') as f:
        data = f.read()
    temp = Template(data)
    res = temp.render(data=user_dict)  # 将字典传递给html页面 页面上通过data即可获取(data仅仅是一个变量名)
    return res


def error(request):
    return  '404 error'

urls.py

添加完新增功能后,在此文件添加对应的功能关系

from views import *

urls = (
    ('/index', index),
    ('/login', login),
    ('/func', func),
    ('/get_dict', get_dict),

)

templates文件夹

里面存放了相同的功能的文件

myhtml02.html
myhtml04.html
....

流程:运行start.py文件,浏览器访问start.py中固定的127.0.0.1:8081,然后通过拼接,获取到想要访问的内容,内容不存在返回404。

流程图

image

image

image

image

-------------------------------------------------以上是静态页展示操作---------------------------------------------------

动静态网页

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

实际需求

​ 后端代码回去当前实际,然后让前端页面展示

​ 1.字符串替换

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

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

jinja2模块

什么是jinja2模块

jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用。

jinja2安装

image

#例子
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
web框架 功能
django框架 大而全 自身携带的功能非常的多 类似于航空母舰

缺陷:开发小项目的时候使用该框架有点笨重(大材小用)
flask框架 小而精 自身携带的功能非常的少 类似于特种兵 主要依赖于第三方模块

缺陷:受限于第三方模块的开发
tornado框架 异步非阻塞 该框架快到可以作为游戏服务器

缺陷:上手难度是三者最高的

拓展:

最近流行框架

FastAPI框架: 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。 关键特性: 快速:可与 NodeJS 和 Go 比肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。
Sanic框架:这次我们来介绍一个 web 框架:Sanic,它既是一个 web 框架,同时也是一个 web 服务器。关于框架,首先浮现在脑海中的就是 Flask、Django 之类的,但它们都是同步框架,而现在是一个高并发的时代,并发量是在构建服务时必须考量的一个指标。所以我们自然就想到了 Python 中的异步框架,而提到异步框架,那么就必须要提  Sanic、FastAPI,这两个异步框架都很优秀,但是 Sanic 的表现要更加出色,使用 Sanic 构建的应用程序足以比肩 Nodejs。如果你再对 Sanic 在路由处理方面使用 C 语言做一些重构,那么并发性能可以和 Go 相媲美。

django框架简介

1.版本问题
​ 1.X:同步 1.11
2.X:同步 2.2
3.X:异步 3.2


ps:你无论使用什么版本都可以 区别不大 2.2

2.启动注意事项
​ 1.计算机名称尽量不要有中文
2.项目中所有的py文件名尽量不要用中文
3.不同版本的python解释器配合不同版本的django 会有一些报错
​ 仔细查找一下报错信息 里面会提示你是哪个py文件里面的代码出错
​ 找到那一行代码 把逗号删除即可
​ widgets.py 152
4.一个pycharm窗口只允许有一个项目 不要做项目的嵌套


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


4.创建app应用
​ """
​ django框架类似于是一个空壳子 给你提供所需的资源
​ 至于到底要写哪些功能 需要通过创建app来划分
​ eg:django初始项目可以看成是一所大学
​ app就相当于是大学里面的各个学院
​ """
​ python38 manage.py startapp 应用名


pycharm操作
​ 鼠标点点点即可

"""
在启动django项目的时候 一定要确保一个端口只有一个项目
"""

命令行与pycharm操作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 自带的小型数据库

应用文件夹 作用
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小白必会三板斧

名称 作用
httpResponse 主要用于直接返回字符串类型的数据
render 主要用于1返回html页面 并且支持模板语法
redirect 主要用于页面重定向
posted @ 2022-08-30 22:23  名字长的像一只老山羊  阅读(22)  评论(0编辑  收藏  举报