Запросы блока из *.appspot.com и вызывают пользовательский домен в Google App Engine

Другая опция состоит в том при создании проекта, просто снимают флажок по умолчанию для, "создают каталог для решения"

14
задан Josh Patton 1 September 2009 в 21:26
поделиться

3 ответа

Вы можете проверить, если os.environ ['HTTP_HOST'] .ndswith ('. Appspot.com') - если да, то вы обслуживаете из something.appspot.com и может отправить перенаправление или иным образом изменить свое поведение по желанию.

Вы можете развернуть эту проверку и перенаправление, если необходимо (или другое изменение поведения по вашему выбору) в любым из различных способов (декораторы, промежуточное ПО WSGI, наследование от вашего промежуточного базового класса, подклассы webapp.RequestHandler [[или любой другой базовый класс обработчика, который вы в настоящее время используете]] и имена методов, отличные от get и опубликуйте в своих классах обработчиков уровня приложения и других), но я думаю, что ключевой идеей здесь является то, что os.Environment устанавливается платформой движка приложения в соответствии со стандартами CGI, поэтому вы можете полагаться на эти стандарты (аналогично WSGI создает свою собственную среду на основе значений, которые он берет из os.environ).

17
ответ дан 1 December 2019 в 09:33
поделиться
def redirect_from_appspot(wsgi_app):
def redirect_if_needed(env, start_response):
    if env["HTTP_HOST"].startswith('my_app_name.appspot.com'):
        import webob, urlparse
        request = webob.Request(env)
        scheme, netloc, path, query, fragment = urlparse.urlsplit(request.url)
        url = urlparse.urlunsplit([scheme, 'www.my_domain.com', path, query, fragment])
        start_response('301 Moved Permanently', [('Location', url)])
        return ["301 Moved Peramanently",
              "Click Here" % url]
    else:
        return wsgi_app(env, start_response)
return redirect_if_needed  
3
ответ дан 1 December 2019 в 09:33
поделиться

Код, размещенный выше, имеет две проблемы - он пытается перенаправить безопасный трафик (который не поддерживается на пользовательских доменах), а также ваши задания cron потерпят неудачу, когда Google вызовет их на вашем домене appspot, и вы обслуживаете до 301.

Я разместил слегка измененную версию в своем блоге: http://blog.dantup.com/2009/12/redirecting-requests-from-appid-appspot-com-to-a-custom-domain

Для удобства я включил код ниже.

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

def run_app(url_mapping):
    application = webapp.WSGIApplication(url_mapping, debug=True)
    application = redirect_from_appspot(application)
    run_wsgi_app(application)

def redirect_from_appspot(wsgi_app):
    """Handle redirect to my domain if called from appspot (and not SSL)"""
    from_server = "dantup-blog.appspot.com"
    to_server = "blog.dantup.com"

    def redirect_if_needed(env, start_response):

        # If we're calling on the appspot address, and we're not SSL (SSL only works on appspot)
        if env["HTTP_HOST"].endswith(from_server) and env["HTTPS"] == "off":

            # Parse the URL
            import webob, urlparse
            request = webob.Request(env)
            scheme, netloc, path, query, fragment = urlparse.urlsplit(request.url)
            url = urlparse.urlunsplit([scheme, to_server, path, query, fragment])

            # Exclude /admin calls, since they're used by Cron, TaskQueues and will fail if they return a redirect
            if not path.startswith('/admin'):
                # Send redirect
                start_response("301 Moved Permanently", [("Location", url)])
                return ["301 Moved Peramanently", "Click Here %s" % url]

        # Else, we return normally
        return wsgi_app(env, start_response)

    return redirect_if_needed
7
ответ дан 1 December 2019 в 09:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: