【问题标题】:How do I cleanly do slugs in Python / Flask?如何在 Python / Flask 中干净利落地做 slug?
【发布时间】:2012-11-28 15:36:57
【问题描述】:

我在 Python / Flask 中有一个针对 MongoDB 的简单 Web 服务:https://github.com/rjurney/Collecting-Data/blob/master/src/python/web/index.py

它一遍又一遍地重复@app.route 代码,就像这样:

@app.route("/email/<message_id>")
def email(message_id):
  email = emaildb.find_one({"message_id": message_id})
  print email
  return render_template('partials/email.html', email=email)

# Enable /emails and /emails/ to serve the last 20 emaildb in our inbox unless otherwise specified
default_offsets={'offset1': 0, 'offset2': 0 + config.EMAIL_RANGE}
@app.route('/', defaults=default_offsets)
@app.route('/emails', defaults=default_offsets)
@app.route('/emails/', defaults=default_offsets)
@app.route("/emails/<int:offset1>/<int:offset2>")
def list_emaildb(offset1, offset2):
  offset1 = int(offset1)
  offset2 = int(offset2)
  emails = emaildb.find()[offset1:offset2] # Uses a MongoDB cursor
  nav_offsets = get_offsets(offset1, offset2, config.EMAIL_RANGE)
  data = {'emails': emails, 'nav_offsets': nav_offsets, 'nav_path': '/emails/'}
  return render_template('partials/emails.html', data=data)

default_search={'offset1': 0, 'offset2': 0 + config.EMAIL_RANGE, 'query': False}
@app.route("/emails/search", defaults=default_search)
@app.route("/emails/search/", defaults=default_search)
@app.route("/emails/search/<string:query>", defaults=default_search)
@app.route("/emails/search/<string:query>/<int:offset1>/<int:offset2>")
def search_email(query, offset1, offset2):
  if query == False:
    query = request.args.get('query')
    return redirect('/emails/search/' + query + '/' + str(offset1) + '/' + str(offset2))
  doc_count = offset2 - offset1
  results = elastic.search(query, {'from': offset1, 'size': doc_count}, indexes=["email"])
  emails = process_results(results)
  nav_offsets = get_offsets(offset1, offset2, config.EMAIL_RANGE)
  data = {'emails': emails, 'nav_offsets': nav_offsets, 'nav_path': '/emails/search/', 'query': query}
  return render_template('partials/emails.html', data=data)

这很丑陋,冒犯了我。这是重复的垃圾。我怎样才能使这个 slug 处理更清洁,这样它就不会在每个控制器上重复?

【问题讨论】:

    标签: python web-services mongodb flask slug


    【解决方案1】:

    这样的事情怎么样:

    @app.route('/')
    @app.route('/emails')
    @app.route('/emails/')
    @app.route("/emails/<int:offset1>/<int:offset2>")
    def list_emaildb(offset1=0, offset2=config.EMAIL_RANGE):
       ...
    

    顺便说一句,不确定是否需要@app.route('/emails'),因为如果你有第二个,Flask 应该将/emails 重定向到/emails/。但也许你还需要/emails(取决于你的需要)所以我把它留在那里。

    【讨论】:

    • 谢谢,非常感谢。但我应该更冗长:我一遍又一遍地这样做。我现在正在更新问题以显示重复,并将链接粘贴到文件中。顺便说一句 - 此代码适用于 O'Reilly 的书,所以我会记入书中正确的回答者:)
    • 如果你的意思是你不喜欢写@app.route太多,你可以尝试编写足够聪明的函数并调用add_url_rule函数 - flask.pocoo.org/docs/api/#flask.Flask.add_url_rule 但你仍然需要定义以某种方式映射。我已经提到了如何减少规则以及如何为函数声明添加默认值。我还看到,例如很多网址都以“电子邮件”开头,所以为什么不将与电子邮件相关的功能移动到单独的模块中,这就是 Flask 中的蓝图 (flask.pocoo.org/docs/blueprints) 也许它会有所帮助:)
    • 很高兴它有帮助 :) 我也喜欢你在书中使用 Flask 作为示例。如果我理解正确,这本书将是关于用 Python 和 Ruby 收集数据的?祝你好运!
    猜你喜欢
    • 2015-10-14
    • 2011-11-28
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多