7

因此,我将 Django 与 Google App Engine 一起使用,并且我有一个 urls.py 文件,该文件将每个 url 重定向到相应的方法。这些方法中的每一个都作为参数之一自动传递“请求”,我相信这是一个 HttpRequest 对象。

如何从我的代码中创建这个填充的请求对象?例如,如果我在代码深处的某个方法中,我希望能够访问这个请求对象,而不必将它传递给每个函数以确保它可用。假设 urls.py 调用方法 foo,我目前这样做的方式是:

foo(request):
    # stuff here
    bar(request)
     # more stuff here

bar(request):
     # stuff here<stuff>
    baz(request)
     # more stuff here

baz(request):
    do something with request here

这似乎是错误的,因为我必须通过不需要它的函数传递请求,以便我可以在 baz 中使用它。

我想做类似的事情:

foo(request):
     # stuff here
    bar()
    # more stuff here

bar():
     # stuff here
    baz()
     # more stuff here

baz():
    request = HttpRequest()
    do something with request here

即如果我不需要,不要传递请求。但是,执行 request = HttpRequest() 返回一个空的请求对象......我想要的是一个完全填充的版本,就像传递给从 urls.py 调用的每个方法中的内容一样。

我在这里浏览了 HttpRequest 的文档:http: //docs.djangoproject.com/en/dev/ref/request-response/ 但没有看到这样做的方法。

任何想法将不胜感激。

谢谢,瑞安

4

2 回答 2

4

request = HttpRequest()会给你一个空的,但你可以写一些东西给它。

这是我在项目中使用的示例:

def new(request):
    ...
    newrequest = HttpRequest()
    newrequest.method = 'GET'
    newrequest.user = request.user
    resp = result_email(newrequest , obj-id , token )
    send_email( resp , ... )
    return HttpResponseRedirect( ... )
    ...
def result_email(request , ...):
    ...
    return render(request , ...)
于 2017-08-04T02:14:34.507 回答
0

只需在视图定义之前创建一个请求变量,并在您从视图接收它时设置它的值(使用您的示例代码):

current_request = None

foo(request):
    current_request = request
    # stuff here
    bar()
    # more stuff here

bar():
     # stuff here
    baz()
     # more stuff here

baz():
    # do something with currest_request here

请参阅:关于 Python 变量范围的注释

更新: 这个问题与您的问题非常相似,接受的解决方案基本上是创建一个全局请求变量并将其附加到设置中。

于 2010-01-19T23:15:27.250 回答