使用Flask,Pyramid或Bottle中的任何一个创建动态重定向?

时间:2011-11-15 03:35:24

标签: python flask pyramid bottle

我想根据用户输入的地址创建一个动态重定向到URL的webapp。当用户通过以下地址访问我的网站时:

http://mydomain1.com/a1b2c3d4

我想将此用户重定向到网址:

http://mydomain2.com/register.php?id=a1b2c3d4&from=mydomain1.com

4 个答案:

答案 0 :(得分:6)

是的,我喜欢好斗!

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)

答案 1 :(得分:2)

这是我的尝试,我几乎是新手,所以它应该有改进的空间

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参数

答案 2 :(得分:0)

我的解决方案是使用路径类型的Werkzeug规则:

host = 'domain2.org'
@app.route('/<path:path>')
def redirection(path):
    return redirect('http://%s/%s' % (host, path), code=301)

如果您移动网站并希望在其他网页上重定向其他网站,则此功能非常有用。

答案 3 :(得分:0)

有一个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