Tengo una función en views.py

def login(request):
   actor = LoginActor(request)
   actor.authenticated_user() # Cannot use return here, this is problematic, we need to redirect here without using a return statement

   ctx = actor.get()

   if request.method == 'POST':
      ctx = actor.post()

      return render(request, 'user/forms/auth.jinja', ctx)
   return render(request, 'user/login.jinja', ctx)

Y hay una redirección en la función authenticated_user() que se define como:

def authenticated_user(self):
    if self.request.user and self.request.user.is_authenticated:
        return redirect('home')

¿Cómo regreso de la vista inicial sin llamar a return, básicamente quiero devolver la función de llamada donde hay un return en la función llamada Estoy usando Django 2.1 con Python 3.7

0
Subhajeet Dey 9 sep. 2018 a las 08:51

3 respuestas

La mejor respuesta

Debería usar clases en lugar de funciones para manejar solicitudes, de hecho, en su caso, puede hacer esto

class LoginView(View):

    login_url = "your login url"
    path = "your path to login template"

    def get(self, request):
        if request.user.is_authenticated():
            return redirect('home')
        else:
            return render(request, self.path)

    def post(self,request):
        #treatment here
        actor = LoginActor(request)
        #I am not sure how you defined LoginActor but should return None if user is not logged in otherwise it returns a logged in user I can help you more if you provide how you defined ActorLogin()
        if actor:
             redirect('home')
        return render(request, self.path,{"error_message":"couldn't login in"})`

Ahora agrega LoginRequiredMixin en sus otras vistas, por lo que no necesita verificar si el usuario ha iniciado sesión o usar UserPassesTest si necesita otros requisitos además del inicio de sesión del usuario. Para obtener más detalles, consulte la documentación oficial sobre el inicio de sesión

https://docs.djangoproject.com/en/1.11/topics/auth/default/#django.contrib.auth.mixins.UserPassesTestMixin

0
abdelwaheb moalla 9 sep. 2018 a las 10:08

Debe dejar tanto la representación como la redirección a la función de vista, y hacer que su función de utilidad authenticated_user devuelva solo un valor booleano en su lugar:

def authenticated_user(self):
    return self.request.user and self.request.user.is_authenticated

def login(request):
   actor = LoginActor(request)
   if actor.authenticated_user():
       return redirect('home')

   ctx = actor.get()

   if request.method == 'POST':
      ctx = actor.post()

      return render(request, 'user/forms/auth.jinja', ctx)
   return render(request, 'user/login.jinja', ctx)
2
blhsing 9 sep. 2018 a las 06:04

Django tiene decoradores para este propósito. Por ejemplo Para permitir que solo los usuarios registrados accedan a la página de inicio,

from django.contrib.auth.decorators import login_required

@login_required(login_url='/accounts/login/')
def home(request):
    ## How home page for only registered users

Puede crear un decorador personalizado para validar usuarios invitados (no registrados). Consulte https: / /medium.com/@MicroPyramid/custom-decorators-to-check-user-roles-and-permissions-in-django-ece6b8a98d9d para obtener ayuda en la creación de un decorador personalizado.

0
gurpreet singh chahal 9 sep. 2018 a las 06:05