Django学习8:session(注册登陆)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/real_Rickys/article/details/82831376

Django学习

 session是开发中不可避免的组件,我们可以使用session来存储,检索,发送接收cookies。

启用sessions

 sessions通过一些中间件来实现。首先在setting.py的 “middleware” 的setting中确保 ‘django.contrib.sessions.middleware.SessionMiddleware’ 存在,同时在 “installed_apps” 中确保 ‘django.contrib.sessions’ 存在。即是在不想使用sessions时可以删除上述的代码。

配置sessions

 通常,sessions将使用你配置的数据库来保存你的sessions,但是也可以手动配置使sessions存储在系统cache中来提高速度:

  1. 使用基于数据库的sessions:这是默认的选择,只需要保证 ‘django.contrib.seesions’ 存在于installed_apps即可。
  2. 使用cached sessions:这个通常用于分布式cache,具体见官方文档。
  3. 使用基于文件的seesions:需要在将session_engine设为:‘django.contrib.sessions.backends.file’ 同时还需要设置设置session_file_path为你想存储session文件的位置,同时要保证允许服务器在本地写入。
  4. 基于cookie的sessions:类似于上述的cached,使用cookie的sessions需要将session_engine设置为 ’django.contrib.sessions.backends.signed_cookies’ 。

在views中使用sessions

 当SessionsMiddleware被激活后,每一个request将会带上‘session’这个类似于字典的属性。可以使用request.session来使用它。下列是其一些常用用法:

  1. 获取XXX的内容:request.session['XXX']
  2. 设置XXX的内容:request.session['XXX']
  3. 如果key不存在就raises keyerror:del request.session['XXX']
    等等,详见官方文档。

 Django在序列化session时默认使用的是JSON。当然可以使用session_serializer来改变,但是还是推荐使用JSON。但是JSON只支持string所以key要用‘XXX’来表示。

一个登陆页面

 说了这么多的理论,其实对于初学者来说,首要的目标是把功能实现出来,那么我们就一步步的开始创建一个用户登陆页面。

创建app

 首先输入如下代码来创建一个app:

py manage.py startapp online

 而后在项目的urls.py中将pattern改成:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('online/', include('online.urls')),
]

 并且在online目录下创建urls.py文件并写入如下代码:

urlpatterns = [
    path('', views.IndexView, name='index'),
    path('login/', views.LogIn, name='login'),
    path('logout/', views.LogOut, name='logout'),
]

 那么先创建一些简单的views:

from django.http import HttpResponse
# Create your views here.


def IndexView(request):
    return HttpResponse("Hello this is index")


def LogIn(request):
    return HttpResponse("Hello this is login")


def LogOut(request):
    return HttpResponse("Hello this is logout")

 之后在online/models.py中写入如下代码

class Member(models.Model):
    username = models.CharField(max_length=100)
    password = models.CharField(max_length=100)

 其后在installed_apps中加入:

'online.apps.OnlineConfig'

 最后在控制台输入:

py manage.py makemigrations online
py manage.py sqlmigrate online 0001
py manage.py migrate
初步完善view

 那么这里的login是用来接收信息而后重定位到index页面,如果是输入无效的用户名密码则留在当前页面;index的定位就是当用户名密码正确时转入的正式页面,并且在没有登陆的时候自动跳转进入login页面;除此之外还有logout页面,用来消除session并进入login界面。

def IndexView(request):
   is_login = request.session.get('IS_LOGIN', False)
   if is_login:
       username = request.session.get('username')
       return render(request, 'online/index.html', {'username':username, })
   else:
       return redirect(reverse('online:login'))


def LogIn(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        member = Member.objects.filter(username = username, password = pwd)
        if member:
            request.session['IS_LOGIN'] = True
            request.session['username'] = username
            return redirect(reverse('online:index'))
        else:
            return render(request, 'online/login.html')
    return render(request, 'online/login.html')



def LogOut(request):
    del request.session["username"]
    del request.session["IS_LOGIN"]
    return redirect(reverse('online:index'))

 这里需要注意的是member = Member.objects.filter(username = username, password = pwd)这个语法可以用来查找是否有username和password符合的记录。

增加注册功能

 在完成了对基本登陆的实现,下一步当然是要完善注册的功能,其定位是在login的页面中增加一个注册选项,进入register.html页面,而后在页面post进入register完成注册。如果注册失败(如没有写全或者有同名的用户)则回到register界面


def Register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        member = Member.objects.filter(username = username, password = pwd)
        if username and pwd and not member:
            m = Member(username=username, password=pwd)
            m.save()
            return redirect(reverse('online:login'))
        else:
            return render(request, 'online/register.html')
    return render(request, 'online/register.html')
展开阅读全文

没有更多推荐了,返回首页