即使未登录也会打开页面,Django

时间:2018-09-20 13:16:33

标签: python django

我做了一个小项目。

用户首先登录,然后将他重定向到主页。

但是,如果用户尚未登录,那么如果我们粘贴该主页的URL,那么该主页也会打开。

我已经尝试了很多网上给出的东西,但是没有用。

这是我的urls.py

from django.conf.urls import url
from django.contrib import admin
from blog import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', views.login, name='login'),
    url(r'^register/$', views.register, name='register'),
    url(r'^home/$', views.home, name='home'),
    url(r'^javaq/$', views.javaq, name='javaq'),
    url(r'^javar/$', views.javar, name='javar'),
    url(r'^csq/$', views.csq, name='csq'),

    url(r'^csr/$', views.csr, name='csr'),
    url(r'^cq/$', views.cq, name='cq'),
    url(r'^cr/$', views.cr, name='cr'),
    url(r'^cppq/$', views.cppq, name='cppq'),
    url(r'^cppr/$', views.cppr, name='cppr'),
    url(r'^pythonq/$', views.pythonq, name='pythonq'),
    url(r'^pythonr/$', views.pythonr, name='pythonr'),
    url(r'^mini/$', views.mini, name='mini'),
]

这是我的观点。py

from django.shortcuts import render
from .models import logininfo,CSTEST,CTEST,CPPTEST,JAVATEST,PYTHONTEST,result
from django.http import HttpResponse

from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.views.decorators.cache import cache_control

import datetime


def login(request):
    if request.method=="POST":
        user_name=request.POST.get("username")
        sid=request.POST.get("sid")
        password=request.POST.get("password")
        article = logininfo()
        article.user_name = user_name
        article.sid = sid
        article.password = password
        article.save()

    return render(request,'login.html')

def home(request):
    if request.method=="POST":
        sid=request.POST.get("sid")
        password=request.POST.get("password")

        request.session['sd'] = sid 
        user_obj=logininfo.objects.filter(sid=sid,password=password)
        if user_obj.count()==0:
            return HttpResponse("Sorry wrong password try again")
    return render(request,'home.html')  

def register(request):
    return render(request,'register.html')

def javaq(request):
    context = {
        'query_results' : JAVATEST.objects.all()
    }
    return render(request, 'javaq.html',context)


def javar(request):

    if request.method=="POST":
        chosenOption = ''
        correctAns = ''
        c=0
        x=1

        for ans in JAVATEST.objects.all():
            chosenOption=str(request.POST.get("java"+str(x)))
            correctAns=str(ans.ANSWER)

            if chosenOption==correctAns:
                c=c+1
            x=x+1
        article = result()
        article.sid = request.session['sd']

        article.marks = c
        article.subject = 'JAVA'
        article.tdate = str(datetime.datetime.now())
        article.save()    
        context = {
            'query_results1' :c

        }

    return render(request, 'javar.html',context)

3 个答案:

答案 0 :(得分:2)

将@login_required装饰器添加到您的视图函数中(该装饰器用于呈现那些不应该出现在未登录用户的页面)。

您可以在this page中对该装饰器有更广泛的了解。

答案 1 :(得分:2)

您可以在页面上使用django内置的登录身份验证

@login_required(login_url='/url where you want user to redirect/') 
def myview(request):
    do something
    return something #returns when user is logged in

答案 2 :(得分:0)

也许您应该看看Django Stronghold

按照说明在您的设置中启用它,默认情况下每个视图都变为私有。

然后,您可以装饰您希望公众访问的任何功能,如下所示:

@public
def register():
    # Do something

这可能是适合初学者的方法,因为您正在做的事情(在主视图中处理身份验证逻辑)意味着您将在每个单独的视图中重复此操作,如果您错过了某些内容,请私有该应用程序的某些部分可能最终会公开。