python网络之web框架

逐步引入:

1. 最简单的web server

#!/usr/bin/env python
# coding:utf-8

import socket

sk = socket.socket()

sk.bind(("127.0.0.1", 8000))

sk.listen()

while 1:
    conn, _ = sk.accept()  # py中使用单下划线代表没有用到的变量

    data = conn.recv(8096)

    print(data)

    conn.send(b‘http/1.1 200 OK\r\ncontent-type:text/html; charset=utf-8\r\n\r\n‘)
    conn.send(b‘<h2>Hello,world.</h2>‘)

    conn.close()
    sk.close()

# 以上是所有浏览器的本质

2.不同路径的响应:

#!/usr/bin/env python
# coding:utf-8

import socket

sk = socket.socket()

sk.bind(("127.0.0.1", 8000))

sk.listen()

# 写一个死循环,一直等待客户端来连我
while 1:
    # 获取与客户端的连接
    conn, _ = sk.accept()
    # 接收客户端发来消息
    data = conn.recv(8096)
    # 把收到的数据转成字符串类型
    data_str = str(data, encoding="utf-8")  # bytes("str", enconding="utf-8")
    # print(data_str)
    # 用\r\n去切割上面的字符串
    l1 = data_str.split("\r\n")
    # print(l1[0])
    # 按照空格切割上面的字符串
    l2 = l1[0].split()
    url = l2[1]
    # 给客户端回复消息
    conn.send(b‘http/1.1 200 OK\r\ncontent-type:text/html; charset=utf-8\r\n\r\n‘)
    # 想让浏览器在页面上显示出来的内容都是响应正文

    # 根据不同的url返回不同的内容
    if url == "/yimi/":
        response = b‘<h1>hello yimi!</h1>‘
    elif url == "/xiaohei/":
        response = b‘<h1>hello xiaohei!</h1>‘
    else:
        response = b‘<h1>404! not found!</h1>‘
    conn.send(response)
    # 关闭
    conn.close()
    # sk.close()

3.函数版server

#!/usr/bin/env python
# coding:utf-8

"""
完善的web服务端示例
函数版根据不同的路径返回不同的内容
"""

import socket

# 生成socket实例对象
sk = socket.socket()
# 绑定IP和端口
sk.bind(("127.0.0.1", 8001))
# 监听
sk.listen()

# 定义一个处理/yimi/的函数
def yimi(url):
    ret = ‘hello {}‘.format(url)
    return bytes(ret, encoding="utf-8")

# 定义一个处理/xiaohei/的函数
def xiaohei(url):
    ret = ‘你好。 {}‘.format(url)
    return bytes(ret, encoding="utf-8")

# 写一个死循环,一直等待客户端来连我
while 1:
    # 获取与客户端的连接
    conn, _ = sk.accept()
    # 接收客户端发来消息
    data = conn.recv(8096)
    # 把收到的数据转成字符串类型
    data_str = str(data, encoding="utf-8")  # bytes("str", enconding="utf-8")
    # print(data_str)
    # 用\r\n去切割上面的字符串
    l1 = data_str.split("\r\n")
    # print(l1[0])
    # 按照空格切割上面的字符串
    l2 = l1[0].split()
    url = l2[1]
    # 给客户端回复消息
    conn.send(b‘http/1.1 200 OK\r\ncontent-type:text/html; charset=utf-8\r\n\r\n‘)
    # 想让浏览器在页面上显示出来的内容都是响应正文

    # 根据不同的url返回不同的内容
    if url == "/yimi/":
        response = yimi(url)
    elif url == "/xiaohei/":
        response = xiaohei(url)
    else:
        response = b‘<h1>404! not found!</h1>‘
    conn.send(response)
    # 关闭
    conn.close()

4.进阶版server

#!/usr/bin/env python
# coding:utf-8

"""
完善的web服务端示例
函数版根据不同的路径返回不同的内容
进阶函数版 不写if判断了,用url名字去找对应的函数名
"""

import socket

# 生成socket实例对象
sk = socket.socket()
# 绑定IP和端口
sk.bind(("127.0.0.1", 8001))
# 监听
sk.listen()

# 定义一个处理/yimi/的函数
def yimi(url):
    ret = ‘hello {}‘.format(url)
    return bytes(ret, encoding="utf-8")

# 定义一个处理/xiaohei/的函数
def xiaohei(url):
    ret = ‘hello {}‘.format(url)
    return bytes(ret, encoding="utf-8")

# 定义一个专门用来处理404的函数
def f404(url):
    ret = "你访问的这个{} 找不到".format(url)
    return bytes(ret, encoding="utf-8")

url_func = [
    ("/yimi/", yimi),
    ("/xiaohei/", xiaohei),
]

# 写一个死循环,一直等待客户端来连我
while 1:
    # 获取与客户端的连接
    conn, _ = sk.accept()
    # 接收客户端发来消息
    data = conn.recv(8096)
    # 把收到的数据转成字符串类型
    data_str = str(data, encoding="utf-8")  # bytes("str", enconding="utf-8")
    # print(data_str)
    # 用\r\n去切割上面的字符串
    l1 = data_str.split("\r\n")
    # print(l1[0])
    # 按照空格切割上面的字符串
    l2 = l1[0].split()
    url = l2[1]
    # 给客户端回复消息
    conn.send(b‘http/1.1 200 OK\r\ncontent-type:text/html; charset=utf-8\r\n\r\n‘)
    # 想让浏览器在页面上显示出来的内容都是响应正文

    # 根据不同的url返回不同的内容
    # 去url_func里面找对应关系
    for i in url_func:
        if i[0] == url:
            func = i[1]
            break
    # 找不到对应关系就默认执行f404函数
    else:
        func = f404
    # 拿到函数的执行结果
    response = func(url)
    # 将函数返回的结果发送给浏览器
    conn.send(response)
    # 关闭连接
    conn.close()

5.返回动态html   其中yimi.html中有个内容是:<p>@@[email protected]@</p>  在响应时将被先替换再返回

"""
完善的web服务端示例
函数版根据不同的路径返回不同的内容
进阶函数版 不写if判断了,用url名字去找对应的函数名
返回html页面
返回动态的html页面
"""

import socket

# 生成socket实例对象
sk = socket.socket()
# 绑定IP和端口
sk.bind(("127.0.0.1", 8001))
# 监听
sk.listen()

# 定义一个处理/yimi/的函数
def yimi(url):
    with open("yimi.html", "r", encoding="utf-8") as f:
       ret = f.read()
    import time
    # 得到替换后的字符串
    ret2 = ret.replace("@@[email protected]@", str(time.time()))
    return bytes(ret2, encoding="utf-8")

# 定义一个处理/xiaohei/的函数
def xiaohei(url):
    with open("xiaohei.html", "rb") as f:
       ret = f.read()
    return ret

# 定义一个专门用来处理404的函数
def f404(url):
    ret = "你访问的这个{} 找不到".format(url)
    return bytes(ret, encoding="utf-8")

url_func = [
    ("/yimi/", yimi),
    ("/xiaohei/", xiaohei),
]

# 写一个死循环,一直等待客户端来连我
while 1:
    # 获取与客户端的连接
    conn, _ = sk.accept()
    # 接收客户端发来消息
    data = conn.recv(8096)
    # 把收到的数据转成字符串类型
    data_str = str(data, encoding="utf-8")  # bytes("str", enconding="utf-8")
    # print(data_str)
    # 用\r\n去切割上面的字符串
    l1 = data_str.split("\r\n")
    # print(l1[0])
    # 按照空格切割上面的字符串
    l2 = l1[0].split()
    url = l2[1]
    # 给客户端回复消息
    conn.send(b‘http/1.1 200 OK\r\ncontent-type:text/html; charset=utf-8\r\n\r\n‘)
    # 想让浏览器在页面上显示出来的内容都是响应正文

    # 根据不同的url返回不同的内容
    # 去url_func里面找对应关系
    for i in url_func:
        if i[0] == url:
            func = i[1]
            break
    # 找不到对应关系就默认执行f404函数
    else:
        func = f404
    # 拿到函数的执行结果
    response = func(url)
    # 将函数返回的结果发送给浏览器
    conn.send(response)
    # 关闭连接
    conn.close()

6.使用wsgiref模块

"""
根据URL中不同的路径返回不同的内容--函数进阶版
返回HTML页面
让网页动态起来
wsgiref模块版
"""

import time
from wsgiref.simple_server import make_server

# 将返回不同的内容部分封装成函数
def yimi(url):
    with open("yimi.html", "r", encoding="utf8") as f:
        s = f.read()
        now = str(time.time())
        s = s.replace("@@[email protected]@", now)
    return bytes(s, encoding="utf8")

def xiaohei(url):
    with open("xiaohei.html", "r", encoding="utf8") as f:
        s = f.read()
    return bytes(s, encoding="utf8")

# 定义一个url和实际要执行的函数的对应关系
list1 = [
    ("/yimi/", yimi),
    ("/xiaohei/", xiaohei),
]

def run_server(environ, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html;charset=utf8‘), ])  # 设置HTTP响应的状态码和头信息
    url = environ[‘PATH_INFO‘]  # 取到用户输入的url
    func = None
    for i in list1:
        if i[0] == url:
            func = i[1]
            break
    if func:
        response = func(url)
    else:
        response = b"404 not found!"
    return [response, ]

if __name__ == ‘__main__‘:
    httpd = make_server(‘127.0.0.1‘, 8090, run_server)
    print("我在8090等你哦...")
    httpd.serve_forever()

7.使用jinja2

from wsgiref.simple_server import make_server
from jinja2 import Template

def index():
    with open("jinja2test.html", "r", encoding="utf-8") as f:
        data = f.read()
    template = Template(data)  # 生成模板文件
    # 从数据库中取数据
    import pymysql

    conn = pymysql.connect(
        host="192.168.112.13",
        port=3306,
        user="root",
        password="123456",
        database="test",
        charset="utf8",
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute("select * from users;")
    user_list = cursor.fetchall()
    # 实现字符串的替换
    ret = template.render({"user_list": user_list})  # 把数据填充到模板里面
    return [bytes(ret, encoding="utf8"), ]

def home():
    with open("home.html", "rb") as f:
        data = f.read()
    return [data, ]

# 定义一个url和函数的对应关系
URL_LIST = [
    ("/index/", index),
    ("/home/", home),
]

def run_server(environ, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html;charset=utf8‘), ])  # 设置HTTP响应的状态码和头信息
    url = environ[‘PATH_INFO‘]  # 取到用户输入的url
    func = None  # 将要执行的函数
    for i in URL_LIST:
        if i[0] == url:
            func = i[1]  # 去之前定义好的url列表里找url应该执行的函数
            break
    if func:  # 如果能找到要执行的函数
        return func()  # 返回函数的执行结果
    else:
        return [bytes("404没有该页面", encoding="utf8"), ]

if __name__ == ‘__main__‘:
    httpd = make_server(‘‘, 8000, run_server)
    print("Serving HTTP on port 8000...")
    httpd.serve_forever()

其中jinja2test.html内容:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
</head>
<body>

<table border="1">
    <thead>
    <tr>
        <th>ID</th>
        <th>用户名</th>
        <th>性别</th>
        <th>年龄</th>
        <th>部门</th>
    </tr>
    </thead>
    <tbody>
    {% for user in user_list %}
    <tr>
        <td>{{user.sno}}</td>
        <td>{{user.sname}}</td>
        <td>{{user.sgender}}</td>
        <td>{{user.sage}}</td>
        <td>{{user.sdept}}</td>
    </tr>
    {% endfor %}
    </tbody>
</table>
</body>
</html>

原文地址:https://www.cnblogs.com/FHBIAO/p/10174541.html

时间: 2024-10-09 20:42:03

python网络之web框架的相关文章

2、基于Python下的web框架之中最具有代表性的一个——Django

是,许多成功的网站和app都基于Django(Uber.Instagram),开放源代码,遵从BSD版权,采用MVC的软件设计模式,及模型M,视图V和控制器C. (BSD:伯克利软件发行版,开源许可协议,保护原始作者的身份,至少得到身份认可,还可以防止其它人将产品据为己有) 如何使用django orm批量创建数据? def bulk_create(self, objs, batch_size=None):     # 批量插入     # batch_size表示一次插入的个数     obj

Django框架介绍 python三大主流web框架之一

一.学习准备 1.下载安装Django(建议安装1.x版本) 方法:终端cmd输入命令:pip install django==1.11.11  然后回车即可 校验是否安装成功:django-admin 二.纯手撸web框架 1.纯手撸web框架 软件开发架构 c/s架构 b/s架构 本质bs也是cs web后端 需求: 1.根据用户输入不同的后缀返回不同的内容 从符合http协议格式的数据中获取用户输入的后缀 不足之处: 1.socket代码是我们自己写的 2.http数据也是我们自己处理的

python 全栈 web框架 Django基本操作

django 操作总结! django框架安装: cmd安装: pip3 install django pycharm安装: 在python变量下 搜索 django 安装 创建django项目: cmd下创建django项目: 创建django程序: django-admin startproject mysite 进入程序目录: cd mysite 启动socket服务端,等待用户发送请求 IP 端口 python manage.py runserver 127.0.0.1:8080 pyc

python 全栈 web框架 Django进阶

django 进阶 基础中,一些操作都是手动创建连接的非主流操作,这样显得太low,当然也是为了熟悉这个框架! 实际中,django自带连接数据库和创建app的机制,同时还有更完善的路由系统机制.既然基础已经了解,那就聊聊主流的东西. 一.web框架重新认知: 既然都是框架,那肯定是都包含了这些模块和对应的功能!但是不同框架之间也是有些诧异,毕竟封装的方法不同. Django: - 路由(url路由系统) - 视图(视图函数) - 模板(模版页面) - 数据库 ---> ORM(类-表:对象-行

web请求响应过程与python主流三大web框架

web请求流程: 首先一个浏览器通过http协议发送一个请求,到我们的服务器,首先是wsgiref接收这个请求,并且解析这个请求中的数据,并将这个数据全部解析成一个env的大字典,wsgiref封装的就是socket连接和数据解析的功能,解析之后得到数据,就能知道浏览器的请求是什么,然后拿着请求类型和urls中的路由与视图函数映射关系获取到到低是要哪个视图,匹配成功之后,再到views.py的具体的视图中去,执行这个具体的特定的视图函数,这个视图函数在执行的过程中,需要首先到templates中

Python轻量Web框架Flask使用

http://blog.csdn.net/jacman/article/details/49098819 目录(?)[+] Flask安装 Python开发工具EclipsePyDev准备 Flask项目框架搭建 MVC模式实例开发 登录实例 Python语言近些年越来越火,其特点是开发迅速,语法简单,可移植等.本人就Python3基础语法写了Demo:https://github.com/tangthis/python3_demo,可以当作基础教程和手册查阅. Python Web开发框架常用

初识python轻量web框架flask

1.使用pip安装Python包 大多数Python包都使用pip实用工具安装,使用pyvenv创建的虚拟环境会自动安装pip. 1.使用pip安装Flask(其它Python包同理) pip install flask 2.一个简单的Demo from flask import Flask from flask import abort from flask import redirect app = Flask(__name__) @app.route('/') def index(): r

python网络爬虫——scrapy框架持久化存储

1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作. 执行输出指定格式进行存储:将爬取到的数据写入不同格式的文件中进行存储 scrapy crawl 爬虫名称 -o xxx.json scrapy crawl 爬虫名称 -o xxx.xml scrapy crawl 爬虫名称 -o xxx.csv 2.基于管道的持久化存储 scrapy框架中已经为我们专门集成好了高效.便捷的持

Python网络爬虫_Scrapy框架_2.logging模块的使用

logging模块提供日志服务 在scrapy框架中已经对其进行一些操作所以使用更为简单 在Scrapy框架中使用: 1.在setting.py文件中设置LOG_LEVEL(设置日志等级,只有高于等于本等级的日志会显示) LOG_FILE(设置日志保存位置,设定后不会在终端显示日志) 2.实例化logger(getLogger方法可以显示__name__也就是文件名) logger.warning("消息"): 以waring等级输出日志消息 在普通文件中使用: 该代码只显示消息 HD