返回顶部
首页 > 资讯 > 后端开发 > Python >python:记一次简单的模拟flas
  • 920
分享到

python:记一次简单的模拟flas

简单pythonflas 2023-01-31 08:01:35 920人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

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

最近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源码

--结束END--

本文标题: python:记一次简单的模拟flas

本文链接: https://lsjlt.com/news/193046.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python:记一次简单的模拟flas
    最近web服务器知识,中间懒癌犯了,断了一两天后思路有点接不上来,手头上也有其他事情要做,先简单的总结下学习进度,很多重要的功能都没跑通,目前flask只是简单实现路由分显示不同的结果,cgi可以根据不同的静态资源或者py脚本文件路径显示...
    99+
    2023-01-31
    简单 python flas
  • 记一次简单的白加黑测试
    前一阵子成了小洋人,所以很长的时间也没更新了,今天更一篇PHP代码审计的吧,此次分享的内容十分的简单,大家简单的看看即可 命令注入 -1 从上述代码,我们可以看出来,$ip变量接收过来之后通过合并运...
    99+
    2023-09-23
    php 安全 web安全
  • 记一次简单的生产环境Mysql调优
    第一次写博客,有漏洞的地方希望大佬指正 背景:优化公司老系统中的一条慢sql,查看执行过程如下: sql虽然比较简单,平时执行也没发现什么问题,但一到生产环境系统频繁调用,问题就显现出来了,整个系统停滞不前,打开Navicat的...
    99+
    2021-06-20
    记一次简单的生产环境Mysql调优
  • 一次简单的Oracle恢复Case实战记录
    发现问题 某网友的数据库由于坏盘了,并且存储掉电,导致数据库无法open了。单看其数据库alert log的错误来看,是非常之简单的,如下: Fri Oct 26 10:33:53 2018 Recov...
    99+
    2024-04-02
  • 使用Python和OpenSSL简单模拟
    本文使用Python和文件系统模拟保密通信的整个过程 本阶段完成系统初始状态模拟,直接看代码 import os,shutil from Crypto.Cipher import DES3,XOR def xorencode...
    99+
    2023-01-31
    简单 Python OpenSSL
  • 一个简单的Go模拟——并发问题
    php小编新一为大家带来了一个简单却有趣的Go模拟游戏,名为“并发问题”。这款游戏以并发编程为主题,让玩家在虚拟的世界中体验并发编程的魅力。游戏中,玩家需要通过编写代码来处理多个任务的...
    99+
    2024-02-09
    数据访问
  • python模拟表单提交(一)
      以后可能要用到这方面的东西,所以先实践一下,比如抢火车票。  第一步:本地搭建一个程序, 如下,代码很丑陋,别笑      主要就是一个用户名,一个密码框,和一个提交按钮 <html>  <head><ti...
    99+
    2023-01-31
    表单 python
  • python scrapy简单模拟登录的代码分析
    1、requests模块。直接携带cookies请求页面。 找到url,发送post请求存储cookie。 2、selenium(浏览器自动处理cookie)。 找到相应的input标签,输入文本,点击登录。 3、s...
    99+
    2022-06-02
    python scrapy 模拟登录
  • GNS3模拟ATM的简单配置
    实验目的: 掌握GNS3下模拟ATM 实验拓扑: 说明: 本实验实验的IOS是c7200-adventerprisek9-mz.124-22.T.bin R1: interface ATM1/0  no ip address&#...
    99+
    2023-01-31
    简单 ATM
  • python入门之一个简单记事本
    最近在练习一个关于python项目的列表,拿到列表看到这是要实现一个记事本功能,刚开始拿到题目真有点懵。虽然用python实现excel的处理已经很熟悉了,且已经把python的知识点都学了一遍,但是用起来还是不顺手呐。尤其是试验之后发现...
    99+
    2023-01-31
    入门 记事本 简单
  • Python模拟登录验证码(代码简单)
    废话不多说了,直接给大家贴代码了。 import urllib import urllib2 import cookielib def getImg(picurl): ''' request for r...
    99+
    2022-06-04
    验证码 代码 简单
  • 用Python简单模拟《原神》抽卡系统
    用Python简单模拟《原神》抽卡系统[抽卡模拟器] 简介代码思想保底机制概率概率公式 代码构建导入软件包random和os初始化概率增加概率保底机制创建文件夹抽卡次数读取出金之后的判断1...
    99+
    2023-09-30
    python 游戏 开发语言
  • 怎么用CSS3制作一个简单的Chrome模拟器
    这篇文章主要介绍“怎么用CSS3制作一个简单的Chrome模拟器”,在日常操作中,相信很多人在怎么用CSS3制作一个简单的Chrome模拟器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2024-04-02
  • 一次搞定PyCharm安装Python:简单操作指南!
    一次搞定PyCharm安装Python:简单操作指南! 在学习和使用Python编程语言的过程中,PyCharm是一个非常流行的集成开发环境(IDE)。它提供了丰富的功能和强大的工具,...
    99+
    2024-02-22
    python 编程 pycharm 操作指南 pip安装 python包
  • 第一次使用webstrom简单创建vue项目的一些报错实战记录
    我的目录层级:工作文件夹为webpackedit,我这里只做简单依赖打包处理,src目录下的main.js引入mathUtil.js文件,将内容展示在index.html界面上,打包...
    99+
    2023-02-13
    webstrom搭建vue项目 webstrom vue 前端vue环境搭建
  • 简单的一次springMVC路由跳转实现
    实现目标:使用springMVC前端控制器,跳转到WEB-INF的templates下面的前端页面 图示 1.目录结构 2.创建一个maven的webapp项目,创建好之后记得把...
    99+
    2024-04-02
  • Android——一个简单的记账本APP
    一个简单的记账本APP 视频效果预览添加账目记录效果预览添加账目记录实现简述实现获取日期字符串时间戳转DateDate转星期 获取时间Switch控制显示和隐藏更改Switch样式事件监听 保存至SQLite数据...
    99+
    2023-08-23
    android sqlite xml android studio java
  • 一个简单的购物商城,记录一下。
    1 #!/usr/bin/env python3 2 Menu = { 3 '电器':{ 4 '电视':{'索尼':'¥2999','康佳':'¥3999','飞利浦':'¥4999','购物车'...
    99+
    2023-01-31
    购物商城 简单
  • 简单模拟node.js中require的加载机制
    一、先了解一下,nodejs中require的加载机制 1、require的加载文件顺序 require 加载文件时可以省略扩展名: require('./module'); ...
    99+
    2022-06-04
    加载 机制 简单
  • 怎么用JavaScript模拟实现简单的MVC
    本篇内容主要讲解“怎么用JavaScript模拟实现简单的MVC”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用JavaScript模拟实现简单的MVC”吧!MVC是一种常见的软件架构模式,...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作