Utilizando proyectos de Django de muestra y mi proyecto Django Rest Framework, puedo implementarlo en el motor de la aplicación sin problemas.

Puedo acceder al sitio a través de https://myappnamehere.appspot.com y la versión http: // como bien.

Sin embargo, aparentemente no puedo forzarlo a permitir solo HTTPS.

Intento 1: en mi configuración de Django, trato de configurar:

SECURE_SSL_REDIRECT = True

Esto termina con mi proyecto que ya no aparece en el motor de aplicaciones, con AppEngine informando que debería intentarlo nuevamente en 30 minutos

Intento 2: En app.yaml, sigo los consejos de aquí y otros hilos de desbordamiento de pila agregando esto:

handlers:
- url: /*
  script: myapplication.wsgi.application

Esto también terminó con el enrutamiento aparentemente en mal estado, y todas mis URL ya no se enrutaron a través del enrutador django como se esperaba.

Qué hay dentro de wsgi: import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapplication.settings.settings")
application = get_wsgi_application()

Intento 3: Lo siento, olvidé mencionar que lo intenté con seguro siempre, y termina con mi sitio siendo incapaz de cargarse también.

handlers:
- url: /*
  script: myapplication.wsgi.application
  secure: always
3
ozhou 11 ene. 2017 a las 06:40

3 respuestas

La mejor respuesta

Todas las respuestas aquí ayudaron a guiarme en el camino correcto. Esta es la configuración final de app.yaml que funcionó para mi proyecto después de un millón de intentos. (También estaba tratando de reducir los costos de los anexos limitando los recursos

# [START runtime]
vm: true
runtime: custom
service: backend-dev

manual_scaling:
   instances: 1

resources:
  cpu: .5
  memory_gb: 0.6
  disk_size_gb: 10

handlers:

- url: /static
  static_dir: static

- url: /.*
  script: myapplication.wsgi.py
  secure: always

# [END runtime]
1
ozhou 16 feb. 2017 a las 02:36

Simplemente agregue un parámetro seguro al archivo app.yaml.

handlers:
- url: /*
  script: anyfile.py
  secure: always

Consulte Configuración de URL seguras en app.yaml

3
Bravin Balasubramaniam 11 ene. 2017 a las 04:00

Como dijo Bravin, un método simple es agregar secure: always a app.yaml. Sin embargo, si le interesan los subdominios consistentes (p. Ej., Siempre va a la dirección www.), entonces debería escribir su propio middleware para redirigirlo a 'https: // www....`

Subdominios consistentes es una cosa de SEO. Los motores de búsqueda pueden contar el dominio simple y el dominio www. como direcciones distintas. Además, algunos certificados SSL solo cubren un subdominio (es decir, www.) y no el dominio simple.

Si escribe su propio middleware, asegúrese de eximir las tareas, crons, backends, etc., o podrían atascarse devolviendo 301s. También exime sus solicitudes de desarrollo localhost.

Además, todavía hay un pequeño porcentaje de usuarios con navegadores o sistemas operativos más antiguos que no pueden recibir SSL utilizando el protocolo SNI. ¿Qué haces con esos? En este ejemplo, aún les servimos contenido seguro, utilizando el certificado appspot.com.

Ejemplo de middleware:

from django.http import HttpResponsePermanentRedirect
import os
import logging

class ForceHttps(object):
    '''
    We want all requests to go to https://www.{mysite}.com
    except: Cron, Taskqueue, backend jobs, dev server

    test this against secure: always in app.yaml

    In this example, we redirect non-SNI compatible browsers to the secure appspot.com address
    '''

    def process_request(self, request):

        user_agent = request.META.get('HTTP_USER_AGENT', 'fake')

        if (    'AppEngine-Google' in user_agent or 
                'mybackendmodule' in request.META.get('CURRENT_MODULE_ID') or
                'dot-appname' in request.META.get('HTTP_HOST') or
                 os.environ.get('SERVER_SOFTWARE', '').lower().startswith('devel') ):
            return None

        # for non-SNI SSL browsers, we send to appspot domain:
        if (
                ((('Windows NT 5.1' in user_agent) or ('Windows XP' in user_agent)) and (('MSIE' in user_agent) or ('Safari' in user_agent) or ('Chrome' in user_agent))) or        # XP with most browsers
                (('MSIE 6' in user_agent) or ('MSIE 5' in user_agent)) or                                                 # any version of IE6 or 5
                ((('Windows NT 6.1' in user_agent) or ('Windows NT 6.2' in user_agent)) and ('webDAV' in user_agent)) or  # IE7 or 8 with webDAV
                (('Android 2.' in user_agent) or ('Android 1.' in user_agent)) ):                                         # android 2.x

            logging.info('Redirecting to appspot.  SNI incompatibility detected: ' + user_agent )

            return HttpResponsePermanentRedirect("https://{appname}.appspot.com" + request.META.get('PATH_INFO'))



        # for SNI compatible browsers:
        if request.META.get('HTTPS') == 'off' or 'www' not in request.META.get('HTTP_HOST') :
            return HttpResponsePermanentRedirect("https://www.{mysite}.com" + request.META.get('PATH_INFO'))

        return None

Asegúrese de agregar 'path_to.my_middleware.ForceHttps' a MIDDLEWARE_CLASSES en SETTINGS.py

1
GAEfan 11 ene. 2017 a las 20:26