Search code examples
pythonflaskbuild-error

url_for Build Error


I'm new at flask and html. I get build error when I try to use action attribute in my html code and I don't have any idea why this happens. this is my html code:

<div class="post">
<form method=post action="{{url_for('add_post')}}" ></a>
<input type="text" name="post" placeholder="What's happenig?" /> 
<input type="submit" value="post" class="post_button" > 
</div><!--end of class post-->

and my flask:

@app.route('/mk/add_post/<username>' , methods=['POST'])
def add_post():
    if request.method == 'POST':
        text=request.form('post')
        user=session['username']        
        post(user , text)
        p='/mk/main/%s'%username
        return redirect(p)

and I get this error:

BuildError: ('add_post', {}, None)

any ideas?


Solution

  • you don't need to define your url path as @app.route('/mk/add_post/<username>' , methods=['POST']) as you are fetching the user name form session. This should work:

    @app.route('/mk/add_post' , methods=['POST'])
    def add_post():
        ...
    

    In case you do wish to stick to '/mk/add_post/<username>'. Change your template to:

    <form method=post action="{{url_for('add_post', username='mahnoosh')}}" ></a>
    

    NOTE: Also you forgot to add username as argument.

    @app.route('/mk/add_post/<username>' , methods=['POST'])
    def add_post(username):
        ...
    

    Here's how I tested:

    python script:

    from flask import *                                  
    
    app = Flask(__name__)                                
    
    @app.route('/mk/add_post/<username>' , methods=['POST'])       
    def add_post(username):                              
        if request.method == 'POST':                     
            print username                               
            return username                              
    
    @app.route('/')                                      
    def main():                                          
        return render_template('so.html')                
    
    if __name__ == "__main__":                           
        app.run(host='0.0.0.0', debug=True, port=5050)
    

    so.html:

    <html>                                                                        
    <div class="post">                                                            
      <form method=post action="{{url_for('add_post', username='mahnoosh')}}" ></a>  
    <input type="text" name="post" placeholder="What's happenig?" />              
    <input type="submit" value="post" class="post_button" >                       
    </div>                                                                        
    </html>