Python Django前奏手撸web框架 基于wsgiref的web框架

基于socke手撸web框架

# 请求首行
b‘GET / HTTP/1.1\r\n  #GET /index HTTP/1.1\r\n  (index)为浏览器请求地址)
# 请求头
Host: 127.0.0.1:8080\r\n
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
Upgrade-Insecure-Requests: 1\r\n
# User-Agent用来标识是不是浏览器
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36\r\n
Sec-Fetch-Mode: navigate\r\n
Sec-Fetch-User: ?1\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\n
Sec-Fetch-Site: none\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
\r\n
请求体

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)
    conn.send(b‘HTTP/1.1 200 OK\r\n\r\n‘)
    print(data)
    data = data.decode(‘utf-8‘)
    current_path = data.split(‘\r\n‘)[0].split(‘ ‘)[1]
    # print(current_path)
    if current_path == ‘/index‘:
        # conn.send(b‘index‘)
        with open(r‘D:\python脱产10期视频\day51\01 纯手撸html文件.html‘,‘rb‘) as f:
            conn.send(f.read())
    elif current_path == ‘/login‘:
        conn.send(b‘login‘)
    else:
        conn.send(b‘hello world!‘)
    conn.close()

手撸版web框架

字符山与二进制字符串转换技巧

data = b‘hello world‘

data = str(data,encoding=‘utf-8‘)
print(data)

data = bytes(data,encoding=‘utf-8‘)
print(data)

字符山与二进制字符串转换技巧

基于wsgiref(主要是方便前后端交互的软件)和jinja2(模板渲染)手撸web框架

from wsgiref.simple_server import make_server
from 代码.urls import urls
from 代码.views import *

def run(env,response):
    """
    env是请求相关的数据
    response是响应相关的数据
    """
    # print(env)
    response(‘200 OK‘,[])
    current_path = env.get(‘PATH_INFO‘)
    # print(current_path)
    # if current_path == ‘/index‘:
    #     return [b‘index‘]
    # elif current_path == ‘/login‘:
    #     return [b‘login‘]
    # 定义一个存储函数名的标志位
    func = None
    for url in urls:
        # 判断当前url在不在元组内
        if url[0] == current_path:
            # 只要匹配上了  就把url后缀对应的函数名赋值给func
            func = url[1]
            # 一旦匹配上 应该立刻退出for循环 节省资源
            break
    # 对变量func做判断
    if func:
        res = func(env)
    else:
        res = errors(env)
    return [res.encode(‘utf-8‘)]

if __name__ == ‘__main__‘:
    server = make_server(‘127.0.0.1‘,8080,run)
    # 实时监测127.0.0.1:8080地址 一旦有客户端来连接 会自动加括号调用run方法
    server.serve_forever()  # 启动服务端

代码/url.py

from 代码.views import *

urls = [
    (‘/index‘,index),
    (‘/login‘,login),
    (‘/reg‘,reg),
    (‘/get_time‘,get_time),
    (‘/get_user‘,get_user),
    (‘/get_db‘,get_db),
]

代码/views.py

def index(env):
    return ‘index‘
def login(env):
    return ‘login‘
def errors(env):
    return ‘404 error‘

def reg(env):
    return ‘reg‘

from datetime import datetime

def get_time(env):
    # 借助于时间模块 现在后端获取到时间数据
    current_time = datetime.now().strftime(‘%Y-%m-%d %X‘)
    with open(r‘templates/02 get_time.html‘,‘r‘,encoding=‘utf-8‘) as f:
        data = f.read()  # data其实就是一串字符串  仅此而已!!!
    data = data.replace(‘$$time$$‘,current_time)
    return data

from jinja2 import Template
def get_user(env):
    user_dict = {‘username‘:‘jason‘,‘password‘:‘123‘,‘hobby‘:[‘read‘,‘game‘,‘running‘]}
    with open(r‘templates/03 get_user.html‘,‘r‘,encoding=‘utf-8‘) as f:
        data = f.read()
    temp = Template(data) # data为html读出来的所有字符串
    res =  temp.render(data = user_dict)  # 将user_dict传递给前端页面 前端页面通过变量名data(html页面中的{{data}})就能够获取到该字典
    return res

import pymysql
def get_db(env):
    conn = pymysql.connect(
        host = ‘127.0.0.1‘,
        port = 3306,
        user = ‘root‘,
        password = ‘123‘,
        database = ‘day51‘,
        charset = ‘utf8‘,
        autocommit = True
    )
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    sql = "select * from userinfo"
    affect_rows = cursor.execute(sql)
    data = cursor.fetchall()
    # print(data)
    with open(r‘templates/04 get_db.html‘,‘r‘,encoding=‘utf-8‘) as f:
        data1 = f.read()
    temp = Template(data1)
    res = temp.render(user_list= data)
    return res

templates

#01 纯手撸html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<h1>要放假了 好嗨皮</h1>
</body>
</html>

#02 get_time.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
$$time$$
</body>
</html>

# 03 get_user.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<p>{{data}}</p>
<p>{{data[‘username‘]}}</p>
<p>{{data.password}}</p>
<p>{{data.get(‘hobby‘)}}</p>
</body>
</html>

# 04 get_db.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">

    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h2 class="text-center">用户数据展示</h2>
            <table class="table table-hover table-bordered table-striped">
                <thead>
                    <tr>
                        <th>id</th>
                        <th>username</th>
                        <th>password</th>
                    </tr>
                </thead>
                <tbody>
                    {%for user_dict in user_list%}
                        <tr>
                            <td>{{user_dict.id}}</td>
                            <td>{{user_dict.name}}</td>
                            <td>{{user_dict.password}}</td>
                        </tr>
                    {%endfor%}
                </tbody>
            </table>
        </div>

    </div>
</div>
</body>

html文件

模板渲染

  1.模板语法:前端可以使用后端语言的语法,来操作后端传过来的数据

静态网页
  数据是写死的,万年不变
动态网页
  数据不是写死的 是动态获取到的
比如:
1.后端实时获取当前时间"传递"给前端页面展示
2.后端从数据库获取数据"传递"给前端页面展示

页面渲染:后端把数据传给前端的过程,并把前端改成自己想要的样式。

总结:

.纯手撸web框架
    1.手动书写socket代码
    2.手动处理http数据

2.基于wsgiref模块帮助我们处理scoket以及http数据
    wsgiref模块
        1.请求来的时候 解析http数据 帮你打包成一个字典传输给你 便于你操作各项数据
        2.响应走的时候 自动帮你把数据再打包成符合http协议格式的样子 再返回给前端

3.封装路由与视图函数对应关系  以及视图函数文件   网站用到的所有的html文件全部放在了templates文件夹下
    1.urls.py 路由与视图函数对应关系
    2.views.py  视图函数(视图函数不单单指函数 也可以是类)
    3.templates  模板文件夹

4.基于jinja2实现模板的渲染
    模板的渲染
        后端生成好数据 通过某种方式传递给前端页面使用(前端页面可以基于模板语法更加快捷简便使用后端传过来的数据)

原文地址:https://www.cnblogs.com/tfzz/p/11514801.html

时间: 2024-10-24 08:58:49

Python Django前奏手撸web框架 基于wsgiref的web框架的相关文章

手撸WEB框架

手撸web框架 软件开发的架构 C/S架构: 客户端 / 服务端 B/S架构: 浏览器 / 服务端 bs的本质也是cs HTTP协议 http是一种超文本传输协议 1.四大特性 基于TCP/I P之上作用于应用层 基于请求响应 无状态 (cookie session token..) 无连接 (长连接 websocket ( http 协议的大补丁)) 2.数据格式 请求格式 请求首行(请求方式, 协议版本.) 请求头(是一大堆k: v键值对) 注意请求头和请求体之间的空格\r\n 请求体(真正

纯手撸web框架

纯手撸web框架 一.Web应用的组成 接下来我们学习的目的是为了开发一个Web应用程序,而Web应用程序是基于B/S架构的,其中B指的是浏览器,负责向S端发送请求信息,而S端会根据接收到的请求信息返回相应的数据给浏览器,需要强调的一点是:S端由server和application两大部分构成,如图所示: 上图:Web应用组成 二.手鲁web应用 2.1 基本版 import socket """ @author RansySun @create 2019-10-18-11:

django简介,安装,文件介绍,三板斧(render,HttpResponse,redirect)HTTP协议,用socket实现简单版web框架,用wsgiref,jinja2,pymysql实现Django运行流程

1.web应用(https://www.cnblogs.com/Dominic-Ji/p/9167438.html) c/s,b/s架构c/s:客户端 服务端b/s:浏览器 服务器?   2.HTTP协议: 超文本传输协议 四大特性: 1.基于TCP/IP作用在应用层之上的协议,底层实现仍为socket 2.基于请求响应:通信一定是从客户端开始,服务器端接收到客户端一定会做出对应响应 3.无状态:协议不对任何一次通信状态和任何数据做保存 4.无连接:一次连接只完成一次请求-响应,请求-响应完毕后

Python之路【第十八篇】:Web框架们

Python之路[第十八篇]:Web框架们 Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. 1 2 3 4 pip install bottle easy_install bottle apt-get install python-bottle wget http://bottlepy.org/bottle.py Bottle框架大致可以分为以下部分: 路

《Flask Web开发 基于Python的Web应用开发实战》简评

指路牌 <Flask Web开发><Flask Web开发 基于Python的Web应用开发实战><Flask Web开发>是否适合新手入门Python Web开发? 正文 <Flask Web开发 基于Python的Web应用开发实战>,O'Reilly"动物书系列"的"狗书",应该是很多Flask初学者被推荐使用的入门书,但是这本书真的适合初学者吗? Python的Web框架非常多,例如Django.Flask.T

Python之路【第十五篇】:Web框架

Python之路[第十五篇]:Web框架 Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/usr/bin/env python #coding:utf-8   import socket   def handle_request(client):     buf = client.recv(10

微信开发python+django两个月的成功经历,django是个好框架!

时间:大三 上学期没有用微信内置浏览器而纯对话开发,坑了自己好一下. 下学期选错bottle框架,以为轻量好,谁知开发中什么都自己来很痛苦. 选对了框架django,终于在大三最后的个把月里写出了里程碑式的现在这个微信端,自己都感动到,作为我大三一年web开发的终结吧. 亮点1:自带后台管理 亮点2:后台权限管理 亮点3:微信回复规则设置去代码化,图形界面. 亮点4:一平台多网店 技巧:微信规则不匹配时不能回复吗?不是,规则包含空字符总能匹配任意文本,请看下面的微信规则截图. 后台 选择botl

基于Python+Django的Kubernetes集群管理平台

原文出自[听云技术博客]:http://blog.tingyun.com/web/article/detail/1345 时至今日,接触kubernetes也有一段时间了,而我们的大部分业务也已经稳定地运行在不同规模的kubernetes集群上,不得不说,无论是从应用部署.迭代,还是从资源调度管理等方面都有其难以言喻的优势,但是随着业务的不断增长,以及服务的多元化,容器的体量与管理的难度也随之增长. 浅述Kubernetes集群日常管理维护中的一些痛点: 1.较为庞大的集群规模及容器数量维护管理

基于Selenium的web自动化框架

1 什么是selenium Selenium 是一个基于浏览器的自动化工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.Selenium WebDriver 和Selenium Grid: Selenium IDE:Firefox的一个扩展,它可以进行录制回放,并可以把录制的操作以多种语言(例如java,python等)的形式导出成测试用例. Selenium WebDriver:提供Web自动化所需的API,主要用作浏览