根据POST请求,执行脚本

时间:2019-02-10 21:42:25

标签: python

我有一个简单的端点用于发布请求。

一旦用户创建如下所示的发布请求,我想执行一个python脚本(例如test.py)。

[
    {
        "sign": "53535",
    },
    {
        "sign": "42122",
    }
]

发布请求后,自行执行脚本的最佳方法是什么?然后,当新的发布请求进入,如下所示的12323时,我想再次自行运行python脚本。

response = requests.get('url')

[
    {
        "sign": "53535",
    },
    {
        "sign": "42122",
    },
    {
        "sign": "12323",
    },
]

2 个答案:

答案 0 :(得分:0)

可能是骇客的解决方案:

  1. 定义一些自定义Middleware,它将使用stdlib中的子进程来触发脚本。

  2. 使用decorator_from_middleware创建一个装饰器以允许分配给各个端点

  3. 将装饰器分配给接收更新的API端点。

每次点击端点时,中间件都会运行,并触发子流程,该子流程将调用您的.py文件。

答案 1 :(得分:0)

您可以尝试通过应用Middleware

来拒绝特定的请求

例如,您可以将MiddlewareJSON Schema结合使用来拦截特定请求并触发所需的脚本。

from jsonschema import validate
class CustomMiddleware(object):
    JSON_SCHEMA={
        "type": "array",
        "items": {
            "type" : "object",
            "properties" : {
              "sign" : {
                "type" : "number"
              }
         }  
    }
    def process_request(self, request):
        if 'application/json' in request.META['CONTENT_TYPE'] and  request.method == 'POST':
            data = request.body
            try:
                validate(data, self.JSON_SCHEMA)
                # Schema is valid invoke your hooks
            except jsonschema.exceptions.ValidationError as ve:
                # proceed request further

但是,如果您需要在请求之间保存状态,最好使用session处理这种情况,

也不要忘记像下面这样在settings.py中添加此中间件

MIDDLEWARE = [
    'your.package.CustomMiddleware',
    'django.middleware.security.SecurityMiddleware',
    ...
]

默认情况下,中间件会捕获所有请求,然后才需要在process_request函数中过滤请求。

JSONSchema用于减少用于验证请求的if-else语句的数量,您可以根据需要以声明方式(而不是命令性方式)定义不同的规则。这确实使您的代码更具可读性和灵活性。您不应该使用JSONSchema,这只是验证请求的一种可能方式。