Python教程

python----web开发

本文主要是介绍python----web开发,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
  • 1. Web应用职责介绍

  • 接收web服务器的动态资源请求,给web服务器提供处理动态资源请求的服务。

  • 2. 动态资源判断

  • 根据请求资源路径进行判断

web服务器程序(web.py)代码:

import socket
import threading
import sys
import framework
​
# 获取用户请求资源的路径
# 根据请求资源的路径,读取指定文件的数据
# 组装指定文件数据的响应报文,发送给浏览器
# 判断请求的文件在服务端不存在,组装404状态的响应报文,发送给浏览器
class HttpWebServer:
    def __init__(self):
        # 1.编写一个TCP服务端程序
        # 创建socekt
        self.tcp_server_socekt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 设置端口复用 
        self.tcp_server_socekt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        # 绑定地址
        self.tcp_server_socekt.bind(("", 8000))
        # 设置监听
        self.tcp_server_socekt.listen(128)
​
    def handle_client_request(self, client_socekt):
        # 获取浏览器的请求信息
        client_request_data = client_socekt.recv(1024).decode()
​
        # 获取用户请求信息
        request_data = client_request_data.split("\r\n")
​
        # 获取请求行数据
        request_line = request_data.pop(0) # 使用pop将请求行数据从列表中取出
        request_line_data = request_line.split(' ')
​
        # 获取请求头部数据
        request_header = {}
        for data in request_data:
            if data == '':
                continue
            request_header[data.split(": ")[0]]=data.split(": ")[1]
​
        # 判断客户端是否关闭
        if len(request_line_data) == 1:
            client_socekt.close()
            return
​
        # 请求行中获取请求资源的路径
        request_path = request_line_data[1]
​
        # 判断是否有查询字符串数据
        request_query = request_path.split('?')
        if len(request_query) > 1:
            request_path = request_query[0]
            query_str = request_query[1]
        else:
            query_str = None
​
        # 构造请求数据
        requests = {
            'path':request_path,
            'query_str':query_str,
            'header':request_header
        }
​
        """动态资源"""
        # 符合wsgi协议的参数
        env = {
            "request_path":request_path,
            "requests":requests
        }
​
        # 应答行
        response_line = "HTTP/1.1 200 OK\r\n"
        # 应答头
        response_header = "Server:pwb\r\nAccess-Control-Allow-Credentials:true\r\nAccess-Control-Allow-Origin:*\r\nAccess-Control-Allow-Methods:GET, POST, PUT\n\rAccess-Control-Allow-Headers:X-Custom-Header"
        # 应答体
        response_body =framework.handle_request(env)
        # 应答数据
        response_data = response_line + response_header + "\r\n\r\n" + response_body
        # 发送数据给到浏览器
        client_socekt.send(response_data.encode())
​
        # 关闭和浏览器通讯的socket
        client_socekt.close()
​
​
    def start(self):
        while True:
            # 2.获取浏览器发送的HTTP请求报文数据
            # 建立链接
            client_socekt, client_addr = self.tcp_server_socekt.accept()
            # 创建子线程
            sub_thread = threading.Thread(target=self.handle_client_request, args=(client_socekt,))
            sub_thread.start()
​
​
if __name__ == '__main__':
    # 创建服务器对象
    my_web_server = HttpWebServer()
    # 启动服务器
    my_web_server.start()
  • 3. 处理客户端的动态资源请求

  1. 创建web应用程序

  2. 接收web服务器的动态资源请求

  3. 处理web服务器的动态资源请求并把处理结果返回给web服务器

  4. web服务器把处理结果组装成响应报文发送给浏览器

web应用程序(framework.py)代码:

"""miniweb,负责处理动态资源请求"""
import re
from pymysql import *
import json
​
​
# ajax请求的数据,获取首页数据
def index(env):
    # 创建链接
    conn = connect(host='localhost', port=3306, database='booksite', user='root', password='mysql', charset='utf8')
    # 创建游标
    cursor = conn.cursor()
​
    # 执行sql语句
    sql = "select *  from bookinfo;"
    cursor.execute(sql)
​
    # 获取数据 元组  ((),())
    stock_data = cursor.fetchall()
​
    # 把元组转化成列表
    center_data_list =[]
    for data in stock_data:
        center_data_list.append({
            "id":data[0],
            "name":data[1],
            "auth":data[2],
            "img_url":data[3],
            "rank":data[4]
        })
     # 把列表转化成json字符串
    # ensure_ascii = False 控制台中可以显示中文
    json_str = json.dumps(center_data_list, ensure_ascii=False)
​
​
    # 关闭连接
    cursor.close()
    conn.close()
​
    return json_str
​
​
​
# 处理动态资源请求
def handle_request(env):
    # 获取动态请求资源路径
    request_path = env["request_path"]
    print("接收到的动态资源请求:", request_path)
​
    if request_path == "/index":
        # 获取首页数据
        result = index(env)
        return result
    else:
        # 没有找到动态资源
        return "404 not found..."
  • 4. 小结

  • 动态资源的判断通过请求资源路径来完成

  • 处理客户端的动态资源请求

    1. 接收web服务器的动态资源请求

    2. Web应用程序处理动态资源请求并把处理结果返回给web服务器

    3. web服务器把处理结果组装成响应报文发送给浏览器

这篇关于python----web开发的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!