尝试将参数传递给函数时,可以通过python中的“@app.route”

2024-06-20 14:54:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将一个参数传递给我在app.route中创建的函数

在下面的代码中,我创建了两个页面,一个主页和一个管理页面。 我想允许或拒绝对/admin页面的访问,这取决于我在python代码中是否直接将参数ADMINpass设置为False或True。 我知道在这种特殊情况下,它会起作用,因为我不需要传递参数,但是如果我在另一个下标中定义我的管理页面并将其导入mainscript,它会告诉我“admin只接受1个参数(给定0)。所以我希望这个函数对任何情况都有效

我现在真的不担心安全性,因为我正在测试东西。 非常感谢,如果已经发布了类似的问题,请道歉。代码如下:

###User section, importing parameters
ADMINpass=False
###End of user section

##Main code
@app.route('/') #Home page
def homepage():
   return 'Hello, main page here'


@app.route('/admin') #Admin page that I want to access
def admin(ADMINpass):  #Trying to pass the argument here will not work, probably because of the app.route
   if ADMINpass==False:    #If admin not activated in code, redirect to homepage
      a=redirect(url_for('homepage'))  
   if ADMINpass == True:  #If admin is activated, permit access
      print('This is the admin page')

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

1条回答
网友
1楼 · 发布于 2024-06-20 14:54:47

这里有几个问题

^decorator是admin()函数的包装器。它提供了额外的功能,可以进行路由注册(允许'/admin'字符串作为端点)、请求处理(可以使用它指定诸如'POST'之类的HTTP方法)等等(请参见Flask docs for route()

如果你这样做了:

@app.route('/admin') #Admin page that I want to access
def admin(ADMINpass):  #Trying to pass the argument here will not work, probably because of the app.route

Flask希望您使用它来参数化端点本身:

@app.route('/endpoint/<something>')
def func(something):
    return something
$ curl localhost:5000/endpoint/value_of_something
value_of_something

我建议Miguel Grinberg's guide to decorators了解更多关于装饰师的信息,重点是烧瓶

回到您的问题,您可以这样做(但请继续阅读,看看为什么我认为您不应该这样做):

ADMINpass=False
@app.route('/endpoint')
def admin():
  global ADMINpass
  return f'ADMINpass is {ADMINpass}'

全局变量的问题在于,它们可以在其他代码段的任何时候更改。这通常是在代码中引入错误、降低代码可维护性和测试难度的好方法

对于服务器,问题更为根本——如果您的代码变得像这样,该怎么办

ADMINpass=False
@app.route('/endpoint')
def admin():
    global ADMINpass
    ADMINpass = not ADMINpass
    return f'ADMINpass is {ADMINpass}'

每一个请求(可能来自不同的客户机)都会改变它,因此其价值几乎无法推理:

$ curl localhost:5000/endpoint
ADMINpass is False
$ curl localhost:5000/endpoint
ADMINpass is True
$ curl localhost:5000/endpoint
ADMINpass is False

您可能正在寻找Flask session objects。会话对象中存储的值特定于每个客户端,因为其实现基于cookie。如果这是一种身份验证机制实现,那么这可能正是您所需要的

from flask import session
app.something = 'value_of_something_else'
@app.route('/endpoint')
def admin():
   return app.something
$ curl localhost:5000/endpoint
value_of_something_else

如果您需要一个静态值,那么克服尝试使用该变量时可能出现的错误的一种方法是使用一个始终可以调用的函数:

def admin_pass():
    return False
@app.route('/endpoint')
def admin():
    if not admin_pass():
        ...

相关问题 更多 >