我想创建一个基于用户输入的地址动态重定向到 URL 的 webapp。当用户通过这样的地址访问我的网站时:
http://mydomain1.com/a1b2c3d4
我想将此用户重定向到 URL:
http://mydomain2.com/register.php?id=a1b2c3d4&from=mydomain1.com
是的,我喜欢一场精彩的战斗!
from pyramid.config import Configurator
from pyramid.httpexceptions import HTTPFound
from paste.httpserver import serve
config = Configurator()
config.add_route('redirect', '/{arg}')
def redirect_view(request):
dst = 'http://mydomain2.com/register.php?id={id}&from={host}'
args = {
'id': request.matchdict['arg'],
'host': request.host,
}
return HTTPFound(dst.format(**args))
config.add_view(redirect_view, route_name='redirect')
serve(config.make_wsgi_app(), host='0.0.0.0', port=80)
这是我的尝试,我在烧瓶中几乎是新手,所以它应该有改进的空间
from flask import Flask, redirect, request
app = Flask(__name__)
host = 'domain2.org'
@app.route('/<path>')
def redirection(path):
return redirect('http://'+host+'/register.php?id='+path+'&from='+request.host)
if __name__ == '__main__':
app.run()
编辑将主机添加到 from 参数
我的解决方案是使用路径类型的 Werkzeug 规则:
host = 'domain2.org'
@app.route('/<path:path>')
def redirection(path):
return redirect('http://%s/%s' % (host, path), code=301)
如果您移动一个站点并想要另一个站点而不是在其他页面上重定向,这将很有用。
有一个 pyramid_rewrite 扩展(https://pypi.python.org/pypi/pyramid_rewrite/)看起来没有维护,但似乎有效。不过,我有一个它没有处理的用例:使用带有 route_prefix 参数的 Configure.include()。
我突然想到通常的方法是在服务器中进行 URL 重写,而我使用的是 Python 标准库中的 WSGI 服务器。它能有多难?
制作一个自定义请求处理程序类:
from wsgiref.simple_server import make_server, WSGIRequestHandler
class MyReqHandler(WSGIRequestHandler):
def get_environ(self):
env = WSGIRequestHandler.get_environ(self)
if env['PATH_INFO'].startswith('/foo'):
env['PATH_INFO'] = env['PATH_INFO'].replace('foo', 'bar', 1)
return env
创建服务器时将其传递给 make_server() :
srvr = make_server('0.0.0.0', 6543, app, handler_class=MyReqHandler)
有用!
对于手头的问题,我只需要直接替换。将其扩展为使用正则表达式并通过一个不错的 API 将其公开将非常简单。
我有另一个解决方案,即直金字塔,因此它可以与其他一些 wsgi 服务器一起使用:
from pyramid.events import NewRequest, subscriber
@subscriber(NewRequest)
def mysubscriber(event):
req = event.request
if req.path_info.startswith('/~cfuller'):
req.path_info = req.path_info.replace('foo', 'bar', 1)
这是声明方式,它需要一个 config.scan()。命令,你会做类似的事情
config.add_subscriber(mysubscriber, NewRequest)
有关事件的详细信息,请参见http://docs.pylonsproject.org/projects/pyramid/en/1.5-branch/narr/events.html。