我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python:记一次简单的模拟flas

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python:记一次简单的模拟flas

最近web服务器知识,中间懒癌犯了,断了一两天后思路有点接不上来,手头上也有其他事情要做,先简单的总结下学习进度,很多重要的功能都没跑通,目前flask只是简单实现路由分显示不同的结果,cgi可以根据不同的静态资源或者py脚本文件路径显示不同的结果。目前来说文章亮点就是解耦做的还行,有一定的可扩展性

简单的仿flask实现路由分发

from wsgiref.simple_server import make_server


''''
WSGI规定:
1. 应用程序需要是一个可调用的对象
2. 可调用对象接收两个参数
3.可调用对象要返回一个值,这个值是可迭代的。
具体参考附录一,pep-0333标准
'''
class SimServer(object):
    def __init__(self):
        self.url_map = {}
    
    def __call__(self, environ, start_response):
        status = u'200 OK'
        response_headers = [('Content-type', 'text/plain')]
        start_response(status, response_headers)
        data=self.dispatch_request(environ)
        return [data.encode('utf-8'),]
    
    def run(self, ip=None, host=None):
        if not ip:
            ip = ''
        if not host:
            host = 8080
        httpd = make_server(ip, host, self)
        httpd.serve_forever()
    
    #路由装饰器
    def route(self, rule):  
        def decorator(f):  
            self.url_map[rule.lstrip('/')] = f
            return f
        
        return decorator
    
    #路由的分发
    def dispatch_request(self, request):
        print(request)
        path = request.get('PATH_INFO', '').lstrip('/')
        print(path)
        return self.url_map[path]()  # 从url_map中找到对应的处理函数,并调用



#创建一个app
app=SimServer()

@app.route('/index')
def index():
    return  'hello world'


@app.route('/login')
def login():
    return 'please login'

if __name__=="__main__":
    app.run()


if __name__=="__main__":
    app.run()

CGI web服务器,静态资源的转发

handler.py

import os
import subprocess

class BaseHandler(object):
    '''Parent for case handlers.'''
    
    def handle_file(self, handler, full_path):
        try :
            with open(full_path, 'rb') as reader:
                content = reader.read()
            handler.send_content(content)
        except IOError as msg:
            msg = "'{0}' cannot be read: {1}".format(full_path, msg)
            handler.handle_error(msg)
    
    def index_path(self, handler):
        return os.path.join(handler.full_path, 'index.html')
    
    def test(self, handler):
        assert False, 'Not implemented.'
    
    def act(self, handler):
        assert False, 'Not implemented.'

#处理首页
class Case_directory_idnex_file(BaseHandler):
    def test(self, handler):
        return (os.path.isdir(handler.full_path) and
                os.path.isfile(self.index_path(handler)))
    
    def act(self, handler):
        self.handle_file(handler, self.index_path(handler))
    

#处理普通html文件
class Case_existing_file(BaseHandler):
    def test(self, handler):
        return os.path.isfile((handler.full_path))
    
    def act(self, handler):
        self.handle_file(handler,handler.full_path)

#处理python脚本        
class Case_cgi_file(BaseHandler):
    def run_cgi(self, handler):
        print('dfs')
        print(handler.full_path)
        data=subprocess.getoutput(['python',handler.full_path])
        print('data={}'.format(data))
        #python3默认使用unicode,需要encode('utf-8')
        return handler.send_content(data.encode('utf-8'))
        
    def test(self,handler):
        return os.path.isfile(handler.full_path) and \
               handler.full_path.endswith('.py')
    def act(self,handler):
        self.run_cgi(handler)
        

requestHandler.py

from http.server import BaseHTTPRequestHandler,HTTPServer
import os
from simpleServer.handler import *


class RequestHandler(BaseHTTPRequestHandler):
    Cases = [Case_cgi_file(),Case_directory_idnex_file(),Case_existing_file() ,]
    
    # How to display an error.
    Error_Page = """\
        <html>
        <body>
        <h1>Error accessing {path}</h1>
        <p>{msg}</p>
        </body>
        </html>
        """
    
    # Classify and handle request.
    def do_GET(self):
        try:
            # 使用join会有问题,目前还没搞清楚+可以,join会有问题
            self.full_path = os.getcwd()+self.path
            # Figure out how to handle it.
            print('cases{}'.format(self.Cases))
            for case in self.Cases:
                if case.test(self):
                    case.act(self)
                    break
        
        # 处理异常
        except Exception as msg:
            print(msg)
            self.handle_error(msg)
    
    # Handle unknown objects.
    def handle_error(self, msg):
        content = self.Error_Page.format(path=self.path, msg=msg)
        self.send_content(content.encode('utf-8'), 404)
    
    # Send actual content.
    def send_content(self, content, status=200):
        self.send_response(status)
        self.send_header("Content-type", "text/html")
        self.send_header("Content-Length", str(len(content)))
        self.end_headers()
        self.wfile.write(content)

if __name__=="__main__":
    severAddress=('',8000)
    server=HTTPServer(severAddress,RequestHandler)
    server.serve_forever()

参考附录

1, pyton:pep-0333
2, flask作者博客文章:getting-started-with-wsgi
3, 自己写一个 wsgi 服务器运行 Django 、Tornado 等框架应用
4, 500L:a-simple-web-server
5, python wsgi简介
6, 从零开始搭建论坛(二):Web服务器网关接口
7, python的 WSGI 简介
8,本文github源码

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python:记一次简单的模拟flas

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python:记一次简单的模拟flas

最近web服务器知识,中间懒癌犯了,断了一两天后思路有点接不上来,手头上也有其他事情要做,先简单的总结下学习进度,很多重要的功能都没跑通,目前flask只是简单实现路由分显示不同的结果,cgi可以根据不同的静态资源或者py脚本文件路径显示不
2023-01-31

记一次简单的生产环境Mysql调优

第一次写博客,有漏洞的地方希望大佬指正背景:优化公司老系统中的一条慢sql,查看执行过程如下:sql虽然比较简单,平时执行也没发现什么问题,但一到生产环境系统频繁调用,问题就显现出来了,整个系统停滞不前,打开Navicat的服务器监控发现里面出现好多执行中的s
记一次简单的生产环境Mysql调优
2021-06-20

一个简单的Go模拟——并发问题

php小编新一为大家带来了一个简单却有趣的Go模拟游戏,名为“并发问题”。这款游戏以并发编程为主题,让玩家在虚拟的世界中体验并发编程的魅力。游戏中,玩家需要通过编写代码来处理多个任务的同时执行,测试自己的并发编程能力。游戏界面简洁明了,操作
一个简单的Go模拟——并发问题
2024-02-09

python scrapy简单模拟登录的代码分析

1、requests模块。直接携带cookies请求页面。 找到url,发送post请求存储cookie。 2、selenium(浏览器自动处理cookie)。 找到相应的input标签,输入文本,点击登录。 3、scrapy直接带cook
2022-06-02

第一次使用webstrom简单创建vue项目的一些报错实战记录

在使用webstorm新建vue项目时常会遇到一些报错,特别是新手第一次运行项目,这篇文章主要给大家介绍了关于第一次使用webstrom简单创建vue项目的一些报错实战记录,需要的朋友可以参考下
2023-02-13

探索手势识别模型的算法和原理(用Python创建一个简单的手势识别训练模型)

手势识别是计算机视觉领域的一个重要研究领域。它的目的是通过解析视频流或图像序列中的人手部动作来确定手势的含义。手势识别具有广泛的应用,例如手势控制的智能家居,虚拟现实和游戏,安防监控等领域。本文将介绍手势识别模型使用的算法和原理,并使用Py
探索手势识别模型的算法和原理(用Python创建一个简单的手势识别训练模型)
2024-01-24

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录