【问题标题】:How to pass arguments to HTML form using flask in case of redirection在重定向的情况下如何使用烧瓶将参数传递给 HTML 表单
【发布时间】:2021-04-08 08:56:57
【问题描述】:

当使用redirect(url_for('Some End-Point')) 而不是render_template() 时,我想将一些参数从flask 传递给我的HTML 表单。我已经访问过这两个问题

  • redirect while passing arguments
  • How can I pass arguments into redirect(url_for()) of Flask?

    但他们都没有我正在寻找的答案。经过一些冲浪后,我发现我必须为此使用session,但问题是我实际上也不知道如何使用它。当我使用这个时:
    return redirect(url_for('register', neg_resp="Username Already Taken"))
    问题是,我的输出消息确实生成但带有URL,因此我的jinja template 没有收到它。来自120.0.0.1:5000/register/ 的链接更改为120.0.0.1:5000/register/?=Username Already Taken
    当我这样做时:
    return redirect(url_for('register'), neg_resp="Username Already Taken")
    生成错误,TypeError: redirect() got an unexpected keyword argument 'neg_resp' 这是我的 Python 代码
# Setting Up Route for Register Page
@app.route('/register/', methods=['GET', 'POST'])
def register():
    # Fetching Form Data
    user = {
        "name": request.form.get('name'),
        "email": request.form.get('email'),
        "username": request.form.get('username'),
        "password": request.form.get('password'),
        "tasks":[]
    }
    # Inserting data to Database and Redirecting to Login Page after Successful Registration
    if user['name'] != None:
        user['password'] = pbkdf2_sha256.encrypt(user['password'])
        if mongo.db.appname.find_one({"username": user["username"]}):
            return redirect(url_for('register'), neg_resp="Username Already Taken")
        else:
            mongo.db.appname.insert(user)
            return redirect(url_for('login', pos_resp="Registered Successfully"))
    return render_template('register.html')

错误 TypeError: redirect() got an unexpected keyword argument 'neg_resp'

【问题讨论】:

    标签: python flask


    【解决方案1】:

    这行不通:

    return redirect(url_for('register'), neg_resp="Username Already Taken")
    

    因为它将neg_resp 作为redirect 的参数而不是url_for 传递。

    这是一个基本示例,说明如何在路由之间和模板之间传递参数:

    @app.route('/first/')
    def first():
        return redirect(url_for('second', passed_value='string value'))
    
    @app.route('/second/')
    def second():
        passed_value = request.args.get('passed_value')
        return render_template('index.html', val_name=passed_value)
    

    【讨论】:

    • 它确实有效,但问题是我试图传递一个列表,我首先将其转换为字符串,然后再次将其转换为列表,但字符串模式也显示为 url,你能告诉我如何删除多余的不需要的部分
    • return render_template('index.html', mylist=vals) 其中 vals 是列表,my_list = request.args.getlist('mylist') 应该可以解决问题
    • render_template只渲染html网页,不会改变URL,所以我们不能使用request.args.getlist('mylist')
    • 或者return redirect(url_for('blueprint.route_name', mylist=vals)) 也可以
    • redirect() 有效,但问题是如果您尝试发送一个值来重定向它只会将该值添加到 url,我不希望这样做,因为它可能还会显示一些安全数据,请参阅我发布的答案,它对我有用
    【解决方案2】:

    所以这就是我尝试的方法,我创建了一个 global dictionary 并在需要的地方不断更新它,现在每当我想访问某些值时,我都会直接从我的字典中访问它并使用 jinja 模板呈现它。除了这种方法之外,还有其他方法以及将数据存储在flask.session 中,也可以使用flask.flash() 来呈现消息并在他们的jinja 模板中使用messages.get() 函数访问它们,但它的问题是,它只提供大小有限,如果您传递超过该大小的对象或字符串,浏览器将忽略它并且您的消息将不会显示,因为传递的消息是browser-cookies 的形式。因此,将它们存储在我的全局字典中对我有用: 这是我最终代码的一个小 sn-p,它与我作为问题发布的代码相似:

    # Globals
    info = {
        'logged_in' : False,
        'user' : {},
        'tasks' : [],
        'status' : {
            'value' : '',
            'positive' : True
        }
    }
    
    def reset():
        '''
        function to reset the values of info object
        '''
        global info
        info['logged_in'] = False
        info['user'] = {}
        info['tasks'] = []
        info['status'] = {
            'value' : '',
            'positive' : True
        }
    
    
    # Setting Up Route for Register Page
    @app.route('/register/', methods=['GET', 'POST'])
    def register():
        '''
        function to register an account into the server and database
        '''
        global info
        # Fetching Form Data
        user = {
            "name": request.form.get('name'),
            "email": request.form.get('email'),
            "username": request.form.get('username'),
            "password": request.form.get('password'),
            "tasks":[]
        }
        # Inserting data to Database and Redirecting to Login Page after Successful Registration
        if user['name'] != None:
            user['password'] = pbkdf2_sha256.encrypt(user['password'])
            if mongo.db.appname.find_one({"username": user["username"]}):
                info['status']['value'] = 'Username Already Taken'
                info['status']['positive'] = False
                return redirect(url_for('register'))
            else:
                mongo.db.appname.insert(user)
                info['status']['value'] = 'Registered Successfully'
                info['status']['positive'] = True
                return redirect(url_for('login'))
        status_val = info['status']['value']
        positive_status = info['status']['positive']
        reset()
        return render_template('register.html', value = status_val, positive = positive_status)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 2013-12-05
      • 2020-12-19
      • 2021-02-28
      • 2015-04-22
      • 2020-06-01
      • 1970-01-01
      相关资源
      最近更新 更多