【问题标题】:Non regex WSGI dispatcher非正则表达式 WSGI 调度程序
【发布时间】:2010-08-29 21:15:39
【问题描述】:

我找到了这个regex based dispatcher,但我真的更愿意使用只使用文字前缀字符串的东西。有这样的东西吗?

我知道写起来并不难,但我不想重新发明轮子。

【问题讨论】:

    标签: python wsgi middleware


    【解决方案1】:

    Flask / Werkzeug 有一个非凡的 wsgi url 调度程序,它不是基于正则表达式的。例如在 Flask 中:

    @myapp.route('/products/<category>/<item>')
    def product_page(category, item):
        pseudo_sql = select details from category where product_name = item;
        return render_template('product_page.html',\
                          product_details = formatted_db_output)
    

    这会让你得到你所期望的,即http://example.com/products/gucci/handbag;这是一个非常好的 API。如果你只想要文字,它很简单:

    @myapp.route('/blog/searchtool')
    def search_interface():
        return some_prestored_string
    

    更新: Per Muhammad 的问题是一个最小的 wsgi 兼容应用程序,它使用来自 Werkzeug 的 2 个非正则表达式实用程序——这只需要一个 url,如果整个路径只是 '/' 你会得到一个欢迎信息,否则你会得到 url:

    from werkzeug.routing import Map, Rule
    
    url_map = Map([
        Rule('/', endpoint='index'),
        Rule('/<everything_else>/', endpoint='xedni'),
    ])
    
    def application(environ, start_response):
        urls = url_map.bind_to_environ(environ)
        endpoint, args = urls.match()
        start_response('200 OK', [('Content-Type', 'text/plain')])
        if endpoint == 'index':
            return 'welcome to reverse-a-path'
        else:
            backwards = environ['PATH_INFO'][::-1]
            return backwards
    

    您可以使用 Tornado、mod_wsgi 等进行部署。当然,除了 MapRule 之外,很难超越 Flask 和 Bottle 的好习惯,或者 Werkzeug 的彻底性和质量。

    【讨论】:

    • 从将 HTTP 请求传递给 wsgi 应用程序的意义上说,它是 wsgi 调度程序吗?或者它与我的答案中的bottle 相同,期望与特定框架一起使用的功能?
    • 参见第二个链接,快速入门部分。但是,是的,您可以将 Werkzeug 路由仅用于纯 wsgi 调度,您可以在 Map 对象上调用 bind_to_environ 方法,并将请求的 wsgi 环境作为应用程序中的参数,然后您就可以关闭并运行了——您可以有一个 wsgi 兼容的应用程序,只需 MapRule 在 6 行代码中。 Flask 只是一组很好的实用程序,可以以更透明的方式处理相同的对象。
    【解决方案2】:

    与您描述的不完全一样,但您的需求可以通过使用bottle 来满足。 route 装饰器更有条理。 Bottle 不托管 WSGI 应用程序,但它可以作为 WSGI 应用程序托管。

    例子:

    from bottle import route, run
    
    @route('/:name')
    def index(name='World'):
        return '<b>Hello %s!</b>' % name
    
    run(host='localhost', port=8080)
    

    【讨论】:

      【解决方案3】:

      我知道这已经有几年了,但这是我快速而肮脏、非常简单的解决方案。

      class dispatcher(dict):
          def __call__(self, environ, start_response):
              key = wsgiref.util.shift_path_info(environ)
              try:
                  value = self[key]
              except:
                  send_error(404)
              try:
                  value(environ, start_response)
              except:
                  send_error(500)
      

      注意事项

      1. 我们利用内置的“dict”类来获得很多功能。
      2. 您需要提供 send_error 例程。

      【讨论】:

        猜你喜欢
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-24
        • 2016-01-11
        • 2014-04-11
        相关资源
        最近更新 更多