How to generate dynamic urls in flask?

前端 未结 4 1015
长情又很酷
长情又很酷 2020-12-16 11:29

I have several records in the database which I Want to form URLs like so:

mysite.com/post/todays-post-will-be-about

The todays-post-will-b

相关标签:
4条回答
  • 2020-12-16 11:40

    Use the @app.route decorator like shown below:

    @app.route('/post/<post_title>')
    def show_post(post_title):
        #use post title to fetch the record from db
    

    More examples are available under the Routing section: http://flask.pocoo.org/docs/0.10/quickstart/#routing

    0 讨论(0)
  • 2020-12-16 11:47

    Flask routes can have parameters as shown here:

    @app.route("post/<identifier>")
    def post(identifier):  # parameter name must match dynamic route parameter name
        the_post = get_from_database_by(identifier)
        response = make_response_from_entity(the_post)
        return response
    

    How you get the post from the database and how you make a response from that is up to you.

    0 讨论(0)
  • 2020-12-16 11:51

    I suggest SQLAlchemy http://flask-sqlalchemy.pocoo.org/ It is a very simple and quick way

    app.py

    from flask import Flask, render_template
    
    try:
        from .alchemy import Post, db
    
    except:
        from alchemy import Post, db
    
    app = Flask(__name__)
    
    @app.route('/post/<url>')
    def post(url):
        url = Post.query.filter_by(url=url).first_or_404()
        id = url.id
        author = url.author 
        title = url.title
        body = url.body
        date = url.date
        return render_template('post.html', title=title, id=id, author=author, body=body, date=date)
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    alchemy.py

    from flask import Flask
    from flask.ext.sqlalchemy import SQLAlchemy
    import datetime
    
    app = Flask(__name__)
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:pasword@localhost/base'
    db = SQLAlchemy(app)
    
    
    class Post(db.Model):
        __tablename__ = "table"
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(200))
        url = db.Column(db.String(220))
        author= db.Column(db.String(50))
        body = db.Column(db.String(50000))
        date  = db.Column(db.DateTime)
    
        def __init__(self, title, url, author, body):
            self.title = title
            self.url = url 
            self.author= author
            self.body = body 
            self.date = datetime.datetime.utcnow()
    
        def __repr__(self):
            return '<Post %r>' % self.url
    
    0 讨论(0)
  • 2020-12-16 12:05

    You can put variable names in your views.py functions. For example:

    # you can also use a particular data type such as int,str
    # @app.route('post/<int:id>', methods=['GET', 'POST'])
    @app.route('post/<variable>', methods=['GET'])
    def daily_post(variable):
        #do your code here
        return render_template("template.html",para1=meter1, para2=meter2)
    

    To get your database information to display on your site, you'll want to pass parameters into the template. So, in your template you'll reference those parameters like:

    <td>Post Author: {{ para1.author }}</td>
    <td>Post Body: {{ para1.body }}</td>
    <td>Date Posted: [{{ para2 }}] times</td>
    

    Then when you visit mysite.com/post/anything_here, the 'anything_here' will go into your function and be evaluated as necessary. You'll probably also want to set up 404 page handling, in case someone tries to enter a post manually:

    @app.errorhandler(404)
    def not_found_error(error):
        return render_template('404.html', pic=pic), 404
    
    0 讨论(0)
提交回复
热议问题