我确定对此有答案,但我似乎找不到。另外,重要的一点是,我对Python还是很陌生。
我最近克隆了这个使用python和wsgi https://github.com/hypothesis/via进行路由的仓库。
我想要的是在URL路径中添加一个参数(无查询字符串),例如:
meow.com/cat_articles/:article_id # i.e. meow.com/cat_articles/677
我该如何实现?
作为参考,我的最终目标是向该文件添加我自己的路径:
答案 0 :(得分:4)
如何向应用程序添加此类路由取决于该应用程序用于实现WSGI的库。我看到您链接到的app.py
文件正在使用werkzeug
(以及static
)。
以下是一些有用的参考,用于在werkzeug
中使用占位符进行路由:
我几乎没有使用过werkzeug
,并且不会声称这绝对是最好的方法,但是一种选择是通过werkzeug
将另一个WSGI应用程序添加到wsgi.DispatcherMiddleware
调用中,该文件的底部。
这里有一些示例代码,可让您在共享的app.py
文件的上下文中开始使用。尝试删除this line之后的所有内容,并将其替换为以下代码:
from werkzeug.routing import Map, Rule
from werkzeug.exceptions import HTTPException
my_url_map = Map([
# Note that this rule builds on the `/cat_articles` prefix used in the `DispatcherMiddleware` call further down
Rule('/<article_id>', endpoint='get_cat_article')
])
def cat_app(environ, start_response):
urls = my_url_map.bind_to_environ(environ)
try:
endpoint, args = urls.match()
except HTTPException, e:
return e(environ, start_response)
if endpoint == 'get_cat_article':
# Note that werkzeug also provides objects for building responses: http://werkzeug.pocoo.org/docs/0.14/wrappers
start_response('200 OK', [('Content-Type', 'text/plain')])
return ['Finally, a cat-centric article about {0}'.format(args['article_id'])]
else:
start_response('404 Not Found', [('Content-Type', 'text/plain')])
return ['Nothing is here...']
application = RequestHeaderSanitiser(app)
application = ResponseHeaderSanitiser(application)
application = Blocker(application)
application = UserAgentDecorator(application, 'Hypothesis-Via')
application = wsgi.DispatcherMiddleware(application, {
'/cat_articles': cat_app,
'/favicon.ico': static.Cling('static/favicon.ico'),
'/robots.txt': static.Cling('static/robots.txt'),
'/static': static.Cling('static/'),
'/static/__pywb': static.Cling(resource_filename('pywb', 'static/')),
'/static/__shared/viewer/web/viewer.html': redirect_old_viewer,
'/h': redirect_strip_matched_path,
})
使用该代码,路径/cat_articles/plants
应该返回:
Finally, a cat-centric article about plants
答案 1 :(得分:2)
首先,我不确定您是要修改via项目还是只是从头开始创建类似内容。
检查源代码后,via项目显示基于Werkzueg-library,后者提供了URL Routing API支持您的寻找
from werkzeug.wrappers import Request, Response
from werkzeug.wsgi import responder
from werkzeug.routing import Map, Rule
def show_cat_article(article_id):
...
url_map = Map(
[Rule("cat_articles/<int:article_id>", endpoint="show_cat_article")]
)
views = {"show_cat_article": show_cat_article}
@responder
def application(environ, start_response):
request = Request(environ)
urls = url_map.bind_to_environ(environ)
return urls.dispatch(lambda e, v: views[e](request, **v),
catch_http_exceptions=True)
现在,如果您不打算直接使用普通的werkzeug,我建议由同一团队研究Flask,如果您不熟悉烧瓶,则如下所述“基于Werkzeug的Python的微框架,……” 。因此,基本上是具有便利功能的轻质包装纸。
Flask允许您通过这样的装饰器添加带有参数的路线:
@app.route("meow.com/cat_articles/<int:article_id>")
def show_cat_article(article_id):
...
或者更少地使用add_url_rule(…)(由装饰器调用)。
def show_cat_article(article_id):
...
app.add_url_rule("meow.com/cat_articles/<int:article_id>", show_cat_article)
答案 2 :(得分:0)
您考虑过这个图书馆吗?我认为它将为您完成工作!