Web框架开发-web框架

一、web框架

  web框架(web framwork)是一种开发框架,用来支持动态网站,网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了。浏览器和服务器的是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率。

二、wsgir模块 

  最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。

如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。

  正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口协议来实现这样的服务器软件,让我们专心用Python编写Web业务。这个接口就是WSGI:Web Server Gateway Interface。而wsgiref模块就是python基于wsgi协议开发的服务模块。

wsgiref

1

2

3

4

5

6

7

8

9

10

11

12

13

from wsgiref.simple_server import make_server

def application(environ, start_response):

    start_response('200 OK', [('Content-Type', 'text/html')])

    return [b'<h1>Hello, Web!</h1>']

httpd = make_server('127.0.0.1', 8080, application)

print('Servering HTTP on port 8080...')

# 开始监听HTTP请求

httpd.serve_forever()

  

三、DIY一个web框架

  

models.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

import pymysql

# 连接数据库

conn = pymysql.connect(host='IP', port=3306, user='root', passwd='123', db='blog') #db:库名

#创建游标

cur = conn.cursor()

# sql='''

# create table userinfo(

#         id int primary key,

#         name varchar(32),

#         password varchar(32)

#         )'''

# cur.execute(sql)

# sql = "insert into userinfo values (%s,%s,%s)"

# var = [(1, 'mike', 123), (2, 'tom', 123)]

# cur.executemany(sql, var)

sql = ("select * from userinfo where name='mike'")

cur.execute(sql)

# 提交

conn.commit()

# 关闭指针对象

cur.close()

# 关闭连接对象

conn.close()

  

启动文件manage.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

from wsgiref.simple_server import make_server

from urls import URLpattern

def applications(environ, start_response):

    # 当前请求路径

    path = environ.get("PATH_INFO")

    print(path)

    start_response('200 OK', [('Content-Type', 'text/html'), ("Charset", "utf8")])

    func = None

    for item in URLpattern:

        if path == item[0]:

            func = item[1]

            break

    if func:

        return [func(environ)]

    else:

        return [b"<h1>404!<h1>"]

if __name__ == '__main__':

    server = make_server("127.0.0.1", 8889, applications)

    print("服务器开始启动")

    server.serve_forever()

  

urls.py

1

2

3

4

URLpattern = (

    ("/login", login),

    ("/favicon.ico", fav),

)

  

views.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

import datetime

import pymysql

from urllib.parse import parse_qs

def login(environ):

    with open("templates/login.html", "rb") as f:

        data = f.read()

    return data

def index(environ):

    with open("templates/index.html", "rb") as f:

        data = f.read()

    return data

def fav(environ):

    with open("templates/favicon.ico", "rb") as f:

        data = f.read()

    return data

def reg(environ):

    with open("templates/reg.html", "rb") as f:

        data = f.read()

    return data

def timer(environ):

    now = datetime.datetime.now().strftime("%y-%m-%d %x")

    return now.encode("utf8")

def auth(request):

    try:

        request_body_size = int(request.get('CONTENT_LENGTH', 0))

    except (ValueError):

        request_body_size = 0

    request_body = request['wsgi.input'].read(request_body_size)

    data = parse_qs(request_body)

    user = data.get(b"user")[0].decode("utf-8")

    pwd = data.get(b"pwd")[0].decode("utf-8")

    # 连接数据库

    conn = pymysql.connect(host='10.1.2.71', port=3306, user='root', passwd='testjfz', db='blog')

    # 创建游标

    cur = conn.cursor()

    SQL="select * from userinfo where name='%s' and password='%s'" %(user,pwd)

    cur.execute(SQL)

    if cur.fetchone():

        f = open("templates/backend.html", "rb")

        data = f.read()

        data = data.decode("utf8")

        return data.encode("utf8")

    else:

        print("OK456")

        return b"user or pwd is wrong"

  

login.html

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

<form action="http://127.0.0.1:8889/auth" method="post">

    username:<input type="text" name="user"><br>

    password: <input type="password" name="pwd"><br>

    <input type="submit" name="btnsbt" value="commit">

</form>

</body>

</html>

  

  

backend.html

1

2

3

4

5

6

7

8

9

10

11

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

    <h4>欢迎来到登录页面</h4>

</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51单片机的万年历闹钟及温度补偿

撰写一篇基于51单片机的万年历闹钟及温度补偿的论文&#xff0c;你需要按照学术论文的标准格式和结构来组织内容。以下是一个大致的论文框架和内容建议&#xff1a; 基于51单片机的万年历闹钟及温度补偿系统设计与实现 摘要&#xff1a; 简要介绍论文的研究背景、目的、方法、…

C++特性之一:继承

1. 派生类的成员变量、成员函数、构造、析构 2. 继承的切片 3. 重定义/隐藏 重定义/隐藏&#xff1a;派生类和基类有同名的成员&#xff0c;就叫隐藏。派生类的成员隐藏了基类的成员。 隐藏时可以通过类作用限定符来访问被隐藏的成员。 class Person { public:void Print(){…

代码学习记录19

随想录日记part19 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.14 主要内容&#xff1a;今天的主要内容是二叉树的第七部分&#xff0c;主要涉及修剪二叉搜索树 &#xff1b;将有序数组转换为二叉搜索树&#xff1b;把二叉搜索树转换为累加树。 669. 修剪…

【UE5】非持枪状态蹲姿移动的动画混合空间

项目资源文末百度网盘自取 在BlendSpace文件夹中单击右键选择动画(Animation)中的混合空间(Blend Space) &#xff0c;选择SK_Female_Skeleton&#xff0c;命名为BS_NormalCrouch 打开BS_NormalCrouch 水平轴表示角色的方向&#xff0c;命名为Direction&#xff0c;方向的最…

原生php单元测试示例

下载phpunit.phar https://phpunit.de/getting-started/phpunit-9.html 官网 然后win点击这里下载 新建目录 这里目录可以作为参考&#xff0c;然后放在根目录下 新建一个示例类 <?phpdeclare(strict_types1);namespace Hjj\DesignPatterns\Creational\Hello;class He…

如何实现系统的高可用性

实现系统的高可用性是确保系统持续提供服务的关键要素。下面是一些常见的高可用方案&#xff1a; 冗余部署&#xff1a;将系统的关键组件部署在多台服务器上&#xff0c;通过搭建主备或者集群的架构来实现冗余。当主服务器出现故障时&#xff0c;备用服务器能够自动接管&#…

Flutter可重排的列表控件ReorderableListView详解

文章目录 ReorderableListView 介绍主要属性使用示例注意事项 ReorderableListView 介绍 ReorderableListView 是 Flutter 中一个可重排的列表控件&#xff0c;允许用户通过拖动来改变列表项的顺序。它继承自 ListView&#xff0c;并提供了一些额外的功能来实现重排功能。 主…

面试 Java 并发编程八股文十问十答第六期

面试 Java 并发编程八股文十问十答第六期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;synchronized 和 R…

安卓通过termux部署ChatGLM

一、安装Termux并进行相关配置 1、安装termux Termux 是一个 Android 终端仿真应用程序&#xff0c;用于在 Android 手机上搭建一个完整的 Linux 环境。 不需要 root 权限 Termux 就可以正常运行。Termux 基本实现 Linux 下的许多基本操作。可以使用 Termux 安装 python&…

23.查询所有列

选择所有列 SELECT * FROM 表名; 用跟在SELECT关键字后面的星号(*),你能够显示表中数据的所有列。 实例&#xff1a; 查询departments表中的所有数据 select * from departments; 选择指定列 select 列名1,列名2... from 表名; 能够用SELECT语句显示表的指定列&#xf…

DB算法原理与构建

参考&#xff1a; https://aistudio.baidu.com/projectdetail/4483048 Real-Time Scene Text Detection with Differentiable Binarization 如何读论文-by 李沐 DB (Real-Time Scene Text Detection with Differentiable Binarization) 原理 DB是一个基于分割的文本检测算…

区块链基础知识(上):区块链基本原理、加密哈希、公钥加密

目录 基本原理 加密哈希&#xff1a; 公钥加密&#xff1a; 希望有人向你发送只有你才能打开的加密文档/消息时使用 PKC 希望向其他人发送加密文档/消息并证明它确实由你发送时使用 PKC 使用 PKC 和加密哈希对文档/消息进行数字签名 交易哈希链使用数字签名转让数字资产所…

SenseNova 商汤日日新大模型 Function Call(函数调用)功能讲解和应用示例

考虑到使用 magic 申请 OpenAPI 的账号挺麻烦的&#xff0c;这里以商汤日日新大模型 SenseNova 介绍 Function Call 的功能。 官方链接&#xff1a;日日新开放平台 一、Function Call 是个啥&#xff1f; 在 LLM&#xff08;Large Language Model&#xff09; 语言大模型时代&…

[论文笔记]DouZero: Mastering DouDizhu with Self-Play Deep Reinforcement Learning

引言 今天带来21年一篇关于用强化学习玩斗地主的论文:DouZero: Mastering DouDizhu with Self-Play Deep Reinforcement Learning。 斗地主是一个具有竞争、合作、信息不完全、状态空间庞大以及大量可能动作的极具挑战性的领域,尤其是合法动作在每一轮中变化显著。在这项工…

SpringBoot 过滤器和拦截器的区别

SpringBoot 过滤器和拦截器的区别 SpringBoot 中的过滤器&#xff08;Filter&#xff09;和拦截器&#xff08;Interceptor&#xff09;都可以在请求处理的不同阶段执行特定的操作&#xff0c;但它们之间存在一些关键的区别&#xff1a; 1. 执行层级 过滤器&#xff08;Filt…

YOLOv9实例分割教程|(二)验证教程

专栏地址&#xff1a;目前售价售价59.9&#xff0c;改进点30个 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 一、验证 打开分割验证文件&#xff0c;填入数据集配置文件、训练好的权重文件&…

报告合集 |2023年,5份必读的“数字孪生”行业报告合集(文末下载)

数字孪生正在快速改变多个行业的面貌。它通过创建物理世界对象的虚拟复制&#xff0c;使得数据分析和系统优化能够在数字空间中实现&#xff0c;正在制造业、城市规划、医疗保健等国家支柱行业展现出巨大的变革力量&#xff0c;为行业的智能决策和预测提供了强大的支撑。 作为…

【UE】AI行为树入门——以小白人跟踪玩家并攻击为例

目录 前言 效果 步骤 一、准备工作 二、用蓝图实现AI随机移动 三、用行为树实现AI随机移动与跟踪玩家并攻击的效果 3.1 AI随机移动 3.2 AI看到玩家后跟踪玩家 3.3 AI攻击玩家 前言 本篇文章要实现的效果是&#xff1a;小白人随机移动&#xff0c;并且在移动过程中如…

电玩城游戏大厅计时软件怎么用,佳易王计时计费管理系统软件定时语音提醒操作教程

电玩城游戏大厅计时软件怎么用&#xff0c;佳易王计时计费管理系统软件定时语音提醒操作教程 一、前言 以下软件操作教程以 佳易王电玩计时计费软件V18.0为例 说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、软件计时计费&#xff0c;只需点击开…

国际前十正规外汇实时行情走势app软件最新排名(综合版)

外汇交易&#xff0c;作为当今世界金融市场上一个重要的板块&#xff0c;备受关注和热议。随着金融市场的日益发展&#xff0c;外汇交易也发展成为一个新兴的投资交易渠道。为了更好地满足投资者对外汇市场的需求&#xff0c;外汇实时行情走势app软件应运而生&#xff0c;它为投…