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中来提高速度:
- 使用基于数据库的sessions:这是默认的选择,只需要保证 ‘django.contrib.seesions’ 存在于installed_apps即可。
- 使用cached sessions:这个通常用于分布式cache,具体见官方文档。
- 使用基于文件的seesions:需要在将session_engine设为:‘django.contrib.sessions.backends.file’ 同时还需要设置设置session_file_path为你想存储session文件的位置,同时要保证允许服务器在本地写入。
- 基于cookie的sessions:类似于上述的cached,使用cookie的sessions需要将session_engine设置为 ’django.contrib.sessions.backends.signed_cookies’ 。
在views中使用sessions
当SessionsMiddleware被激活后,每一个request将会带上‘session’这个类似于字典的属性。可以使用request.session来使用它。下列是其一些常用用法:
- 获取XXX的内容:
request.session['XXX']
- 设置XXX的内容:
request.session['XXX']
- 如果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')