Python中web.py框架如何使用装饰器限制类只能访问POST接口?

网上看见一段代码 web.py 类被路由导向,找了一下 web.py 还没有像 flask 和 django 那样的装饰器限制只能访问 post 接口或 get 接口 就像下面的函数 我如果要让类只能 post 接口被访问有什么方法么 还有 read_file 函数 因为类被路由导向会不会有被外部访问的危险?

#!/usr/bin/python #--coding:utf8--

import web import sys,os

FILE={ "test":"./test.txt" }

class fileRead(object): def GET(self,name): return self.read_file(name) def POST(self, name): return self.read_file(name) def read_file(self, name): file_data = "" web.header('Content-Type','text/json;charset=utf-8',unique=True) if name not in FILE: file_data="file name error" return file_data path = FILE(name) if not os.path.isfile(path): file_data= return file_data fp = open(path, 'r') file_data = fp.read() return file_data if name== 'main': urls = ( '/(.*)','fileRead' ) app = web.application(urls, globals()) app.run()


Python中web.py框架如何使用装饰器限制类只能访问POST接口?

6 回复

复制效果不太好 直接给个地址吧…
https://blog.csdn.net/PgZHJ/article/details/80447840


在web.py里,要限制类方法只响应POST请求,可以用装饰器搞定。下面是个完整的例子:

import web

# 定义只允许POST的装饰器
def post_only(func):
    def wrapper(self, *args, **kwargs):
        if web.ctx.method != 'POST':
            raise web.HTTPError('405 Method Not Allowed', 
                               {'Allow': 'POST'})
        return func(self, *args, **kwargs)
    return wrapper

urls = (
    '/test', 'TestHandler'
)

class TestHandler:
    @post_only
    def POST(self):
        return "This only accepts POST requests"
    
    # GET方法不会被装饰,但为了明确可以这样写
    def GET(self):
        raise web.HTTPError('405 Method Not Allowed', 
                           {'Allow': 'POST'})

app = web.application(urls, globals())

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

关键点:

  1. post_only装饰器检查web.ctx.method,如果不是POST就抛405错误
  2. 装饰器要放在类方法上,web.py会根据HTTP方法名(POST/GET等)自动路由
  3. 记得在GET方法里也抛出405,这样更规范

这样你的TestHandler就只能通过POST访问了,GET请求会返回405状态码。

总结:用装饰器检查请求方法并抛异常。

1.关于限制仅 POST 请求访问,你只需 def POST 就好了啊。以你给的这段代码,为例,不希望接受 GET 请求,那就直接删掉 def GET 相关的代码就可以了。
2.关于装饰器,给你个参考吧 https://gist.github.com/oxtopus/5183141


题外话,自从 Aaron Swartz 离开以后我也坚持了一段时间 web.py ,最近转到 Sanic,刚才一瞬间差点不认识楼主的代码了

LZ 正解,把 get 相关的屏蔽掉

谢谢了 我发现我钻牛角尖了 不想让 read_file 函数被访问直接设置成私有方法就好了 不接收 GET 请求直接给 get 接口删了就好了

#4 现在还在坚持 webpy 的人太少了,加油
web[dot]py 被识别为外链了 [请不要在每一个回复中都包括外链,这看起来像是在 spamming] 手动狗头

回到顶部