我发现了这个regex based dispatcher,但我真的更喜欢使用只使用文字前缀字符串的东西。这样的事情存在吗?
我知道写起来并不难,但我宁愿不重新发明轮子。
答案 0 :(得分:3)
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的问题是使用来自Werkzeug的2个非正则表达式实用程序的最小wsgi兼容应用程序 - 这只需要一个网址,如果整个路径只是'/'你会得到一个欢迎留言,否则你会向后收到网址:
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等进行部署。当然,很难超越Flask and Bottle的好习语,或者超越Map
和Rule
的Werkzeug的彻底性和质量。< / p>
答案 1 :(得分: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)
答案 2 :(得分:0)
我知道已经有几年了,但这是我快速又肮脏,简单易用的解决方案。
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)
注释