【问题标题】:How to generate dynamic urls in flask?如何在烧瓶中生成动态网址?
【发布时间】:2016-01-30 22:19:39
【问题描述】:

我在数据库中有几条记录,我想像这样形成 URL:

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

todays-post-will-be-about 将从数据库中提取。

有什么办法可以在烧瓶中完成吗?

【问题讨论】:

  • 那么一天特定页面的 URL 每天都会根据数据库返回的 URL 变化? /post/today 不是固定不变的,而是每天指向不同的 URL?

标签: python flask


【解决方案1】:

您可以将变量名称放在您的 views.py 函数中。例如:

# 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)

要让您的数据库信息显示在您的网站上,您需要将参数传递到模板中。因此,在您的模板中,您将引用这些参数,例如:

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

然后,当您访问 mysite.com/post/anything_here 时,“anything_here”将进入您的函数并在必要时进行评估。您可能还需要设置 404 页面处理,以防有人尝试手动输入帖子:

@app.errorhandler(404)
def not_found_error(error):
    return render_template('404.html', pic=pic), 404

【讨论】:

  • 我实际上并没有过多考虑 Flask SEO(搜索引擎优化),因为我正在将一个教堂网站作为一个副项目工作。但是,如果我正确理解 SEO,爬虫会点击您的网站并将这些页面编入索引,只要所有动态 URL 都在可点击距离内,您就不需要任何特殊优化
  • @ILovePython 如果谷歌可以点击链接,他们将能够抓取。爬虫通过点击链接和索引他们到达的页面来工作,所以只要它是可点击的,他们就能够爬取 URL。
【解决方案2】:

使用@app.route 装饰器,如下所示:

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

路由部分提供了更多示例: http://flask.pocoo.org/docs/0.10/quickstart/#routing

【讨论】:

    【解决方案3】:

    Flask 路由可以有参数如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
    

    如何从数据库中获取帖子以及如何做出回应取决于您。

    【讨论】:

      【解决方案4】:

      我建议使用 SQLAlchemy http://flask-sqlalchemy.pocoo.org/ 这是一个非常简单快捷的方法

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-20
        • 2016-04-02
        • 1970-01-01
        • 2014-09-22
        • 1970-01-01
        • 2014-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多