【发布时间】:2010-08-29 21:15:39
【问题描述】:
我找到了这个regex based dispatcher,但我真的更愿意使用只使用文字前缀字符串的东西。有这样的东西吗?
我知道写起来并不难,但我不想重新发明轮子。
【问题讨论】:
标签: python wsgi middleware
我找到了这个regex based dispatcher,但我真的更愿意使用只使用文字前缀字符串的东西。有这样的东西吗?
我知道写起来并不难,但我不想重新发明轮子。
【问题讨论】:
标签: python wsgi middleware
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 等进行部署。当然,除了 Map 和 Rule 之外,很难超越 Flask 和 Bottle 的好习惯,或者 Werkzeug 的彻底性和质量。
【讨论】:
bottle 相同,期望与特定框架一起使用的功能?
Map 对象上调用 bind_to_environ 方法,并将请求的 wsgi 环境作为应用程序中的参数,然后您就可以关闭并运行了——您可以有一个 wsgi 兼容的应用程序,只需 Map 和 Rule 在 6 行代码中。 Flask 只是一组很好的实用程序,可以以更透明的方式处理相同的对象。
与您描述的不完全一样,但您的需求可以通过使用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)
【讨论】:
我知道这已经有几年了,但这是我快速而肮脏、非常简单的解决方案。
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)
注意事项
【讨论】: