如果没有登录,请避免通过URL访问其他页面(Django)

时间:2015-02-23 15:08:33

标签: python django login

团队,我使用了Django身份验证模型来验证登录我的博客,但它仍然允许用户通过URL访问其他受限制的页面,我需要避免这种情况,请帮忙。请尽可能添加最大的细节,我正在努力解决这个问题

型号:

from django.db import models
from django.db.models import permalink
from django.contrib.auth.models import User


class Post(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    datposted = models.DateTimeField('date posted')
    category = models.ForeignKey('Category')
    owner = models.ForeignKey('UserProfile')

    def __str__(self):
        return '%s' % self.title

class Category(models.Model):
    title = models.CharField(max_length=100)
    def __str__(self):
        return self.title

class UserProfile(models.Model):
    # This line is required. Links UserProfile to a User model instance.
    user = models.OneToOneField(User)

    # The additional attributes we wish to include.
    website = models.URLField(blank=True)
    picture = models.ImageField(upload_to='profile_images', null=True)


    def __unicode__(self):
        return self.user.username

class Logout(User):
    force_logout_date = models.DateTimeField(null=True, blank=True)

查看:

def index(request):
    template = "index.html"
    return render(request,template)


def menu(request):
    return render(request,"menu.html")

def view_posts(request):   
    return render_to_response('posts.html',{'posts':Post.objects.all()})

def view_post(request, post_id=1):
    return render_to_response('view_post.html',{'post':Post.objects.get(id=post_id)})


def view_by_year(request):
    cur_year=timezone.now().year
    posts_cur_year = Post.objects.filter(datposted__year=cur_year)
    return render_to_response('view_by_year.html',{'posts_cur_year':posts_cur_year})


def view_by_month(request):
    cur_month=timezone.now().month
    posts_cur_month = Post.objects.filter(datposted__month=cur_month)
    return render_to_response('view_by_month.html',{'posts_cur_month':posts_cur_month, 'cur_month':cur_month})


def view_by_owner(request):
    user = request.user
    posts_owner = Post.objects.filter(owner__user=request.user)
    return render_to_response('view_by_owner.html',{'view_owner':posts_owner})


def register(request):
    # Like before, get the request's context.
    context = RequestContext(request)
    # A boolean value for telling the template whether the registration was successful.
# Set to False initially. Code changes value to True when registration succeeds.
    registered = False


    if request.method == 'POST':
    # Attempt to grab information from the raw form information.
    # Note that we make use of both UserForm and UserProfileForm.
        user_form = UserForm(data=request.POST)
        profile_form = UserProfileForm(data=request.POST)

    # If the two forms are valid...
        if user_form.is_valid() and profile_form.is_valid():
        # Save the user's form data to the database.
            user = user_form.save()

        # Now we hash the password with the set_password method.
        # Once hashed, we can update the user object.
            user.set_password(user.password)
            user.save()

        # Now sort out the UserProfile instance.
        # Since we need to set the user attribute ourselves, we set commit=False.
        # This delays saving the model until we're ready to avoid integrity problems.
            profile = profile_form.save(commit=False)
            profile.user = user


            profile.save()


            registered = True


        else:
            print user_form.errors, profile_form.errors

# Not a HTTP POST, so we render our form using two ModelForm instances.
# These forms will be blank, ready for user input.
    else:
        user_form = UserForm()
        profile_form = UserProfileForm()

# Render the template depending on the context.
    return render_to_response(
            'register.html',
            {'user_form': user_form, 'profile_form': profile_form, 'registered': registered},
        context)

def user_login(request):
# Like before, obtain the context for the user's request.
    context = RequestContext(request)

# If the request is a HTTP POST, try to pull out the relevant information.
    if request.method == 'POST':
    # Gather the username and password provided by the user.
    # This information is obtained from the login form.
        username = request.POST['username']
        password = request.POST['password']

    # Use Django's machinery to attempt to see if the username/password
    # combination is valid - a User object is returned if it is.
        user = authenticate(username=username, password=password)

    # If we have a User object, the details are correct.
    # If None (Python's way of representing the absence of a value), no user
    # with matching credentials was found.
        if user:
        # Is the account active? It could have been disabled.
            if user.is_active:
            # If the account is valid and active, we can log the user in.
            # We'll send the user back to the homepage.
                login(request, user)
                return HttpResponseRedirect('/menu/')
            else:
            # An inactive account was used - no logging in!
                return HttpResponse("Sua conta nao esta ativa.")
        else:
        # Bad login details were provided. So we can't log the user in.
            print "Credenciais Incorretas: {0}, {1}".format(username, password)
            return HttpResponse("Login invalido.")

# The request is not a HTTP POST, so display the login form.
# This scenario would most likely be a HTTP GET.
    else:
    # No context variables to pass to the template system, hence the
    # blank dictionary object...
        return render_to_response('login.html', {}, context)

def create_post(request):
    if request.method == 'POST':
        form = CreatePostForm(request.POST)

        if form.is_valid():
            post = form.save(commit=False)
            post.datposted = datetime.datetime.now()
        #post.owner = request.user()
            post.save()
            return HttpResponseRedirect('/posts/')
        else:
            return HttpResponse("Favor. Verifique os campos necessarios")

    else:
        form = CreatePostForm()
        f = {'form' : form}
        return render(request,'create_post.html',f)

def logout(request):
    auth.logout(request)
    return render_to_response('logout.html')

1 个答案:

答案 0 :(得分:1)

您可以在要保护的每个视图上方使用@login_required装饰器:

@login_required
def index(request):
    template = "index.html"
    return render(request,template)

这将确保用户在允许用户访问使用此装饰器的每个视图之前已登录。

有关详细信息,请参阅Documentation