Создание динамического перенаправления с использованием любого из Flask, Pyramid или Bottle? - PullRequest
0 голосов
/ 15 ноября 2011

Я хочу создать веб-приложение, которое динамически перенаправляет на URL-адрес, основываясь на адресе, введенном пользователем.Когда пользователь посещает мой сайт по адресу, подобному следующему:

http://mydomain1.com/a1b2c3d4

Я хочу перенаправить этого пользователя на URL:

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

Ответы [ 4 ]

6 голосов
/ 15 ноября 2011

Да, я люблю хороший бой!

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)
2 голосов
/ 16 ноября 2011

Вот моя попытка, я почти новичок в колбе, поэтому в ней должно быть место для улучшения

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

0 голосов
/ 15 марта 2015

Существует расширение pyramid_rewrite (https://pypi.python.org/pypi/pyramid_rewrite/), которое выглядит не поддерживаемым, но, кажется, работает. У меня был вариант использования, который он не обрабатывал, хотя: с помощью Configure.include () с параметром route_prefix.

Мне пришло в голову, что обычным подходом является перезапись URL-адресов на сервере, и я использовал WSGI-сервер из стандартной библиотеки Python. Насколько сложно это может быть?

Создание собственного обработчика запросовкласс:

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 дляхудой на событиях.

0 голосов
/ 10 сентября 2012

Мое решение состояло в том, чтобы использовать правило Werkzeug, используя тип пути:

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

Это может быть полезно, если вы перемещаете сайт и хотите использовать другой сайт с перенаправлением на другие страницы.

...