一:创建项目和应用:
或者用命令创建:
1:django
-
admin.py startproject CBV&FBV
2: cd CBV&FBV (路径切到该文件夹下)
3: python3 manage.py startapp app01
二:数据库迁移:
三:创建超级用户(做登录验证需要)
四 :分配路由 urls.py
五:登录验证视图函数 views.py----FBV(functiion Base Views)
方法一:
from django.shortcuts import render,HttpResponse,redirect from django.contrib import auth # Create your views here. def index(request): user = request.user if user.is_authenticated: return render(request,'index.html') return redirect('/login/') def log_in(request): if request.method == "POST": user = request.POST.get('user') password = request.POST.get('pwd') user_obj = auth.authenticate(username=user,password=password) if user_obj: auth.login(request,user_obj) return redirect('/index/') return render(request,'login.html')
方法二:
或者在setting.py中加入:
LOGIN_URL=('/login/')
from django.shortcuts import render,HttpResponse,redirect from django.contrib import auth from django.contrib.auth.decorators import login_required # Create your views here. @login_required def index(request): return redirect('/login/') def log_in(request): if request.method == "POST": user = request.POST.get('user') password = request.POST.get('pwd') user_obj = auth.authenticate(username=user,password=password) if user_obj: auth.login(request,user_obj) return redirect('/index/') return render(request,'login.html')
方法三:利用session
from django.shortcuts import render,HttpResponse,redirect from django.contrib import auth # Create your views here. def index(request): if request.session.get('user_info'): return render(request,'index.html') return redirect('/login/') def log_in(request): if request.method == "POST": user = request.POST.get('user') password = request.POST.get('pwd') user_obj = auth.authenticate(username=user,password=password) # if user == 'root' and password=='root1234': (如果是用自己对数据库表,可以自己做判断。我这是直接用django的user表就直接用auth判断) if user_obj: request.session['user_info'] = user return redirect('/index/') return render(request,'login.html')
六:登录验证视图函数 views.py----CBV(Class Base Views)
urls.py:
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index', views.Index.as_view()), url(r'login',views.Log_in.as_view()), ]
view.py
方法一:
from django.shortcuts import render,HttpResponse,redirect from django.views import View from django.contrib import auth class Index(View): '''先走dispatch再走其它函数''' def dispatch(self,request,*args,**kwargs): print('before') res = super(Index,self).dispatch(request,*args,**kwargs) print('after') return res def get(self,request,*args,**kwargs): return render(request,'index.html') def post(self,request,*args,**kwargs): return HttpResponse(99999) class Log_in(View): def get(self,request,*args,**kwargs): return render(request,'login.html') def post(self,request,*args,**kwargs): user = request.POST.get('user') password = request.POST.get('password') user_obj = auth.authenticate(username=user,password=password) if user_obj: request.session['user_info']=user return redirect('/index/') return render(request, 'index.html')
方法二:单独写个认证类,其余类继承该类
from django.shortcuts import render,HttpResponse,redirect from django.views import View from django.contrib import auth class AuthView(object): def dispatch(self, request, *args, **kwargs): if not request.session.get('user_info'): return redirect('/login.html') res = super(AuthView,self).dispatch(request, *args, **kwargs) return res class Index(AuthView,View): '''先走dispatch再走其它函数''' def get(self,request,*args,**kwargs): return render(request,'index.html') def post(self,request,*args,**kwargs): return HttpResponse(99999) class Log_in(AuthView,View): def get(self,request,*args,**kwargs): return render(request,'login.html') def post(self,request,*args,**kwargs): user = request.POST.get('user') password = request.POST.get('password') user_obj = auth.authenticate(username=user,password=password) if user_obj: request.session['user_info']=user return redirect('/index/') return render(request, 'index.html')
方法三:装饰器:注意装饰器的写法
from django.shortcuts import render,HttpResponse,redirect from django.views import View from django.contrib import auth from django.utils.decorators import method_decorator from django.contrib.auth.decorators import login_required @method_decorator(login_required) class Index(View): '''先走dispatch再走其它函数''' def get(self,request,*args,**kwargs): return render(request,'index.html') def post(self,request,*args,**kwargs): return HttpResponse(99999) class Log_in(View): def get(self,request,*args,**kwargs): return render(request,'login.html') def post(self,request,*args,**kwargs): user = request.POST.get('user') password = request.POST.get('password') user_obj = auth.authenticate(username=user,password=password) if user_obj: request.session['user_info']=user return redirect('/index/') return render(request, 'index.html')
装饰器的用法:
装饰器 get, post方法上 class LoginView(View): def dispatch(self, request, *args, **kwargs): return super(LoginView, self).dispatch(request, *args, **kwargs) def get(self, request): return render(request, 'login.html') @method_decorator(login_required) def post(self, request): # request.GET # request.POST # 请求头中的:content-type # request.body user = request.POST.get('user') pwd = request.POST.get('pwd') if user == 'alex' and pwd == "alex3714": # 生成随机字符串 # 写浏览器cookie: session_id: 随机字符串 # 写到服务端session: # { # "随机字符串": {'user_info':'alex} # } request.session['user_info'] = "alex" return redirect('/index.html') return render(request, 'login.html') dispatch方法上 class LoginView(View): @method_decorator(login_required) def dispatch(self, request, *args, **kwargs): return super(LoginView, self).dispatch(request, *args, **kwargs) def get(self, request): return render(request, 'login.html') def post(self, request): # request.GET # request.POST # 请求头中的:content-type # request.body user = request.POST.get('user') pwd = request.POST.get('pwd') if user == 'alex' and pwd == "alex3714": # 生成随机字符串 # 写浏览器cookie: session_id: 随机字符串 # 写到服务端session: # { # "随机字符串": {'user_info':'alex} # } request.session['user_info'] = "alex" return redirect('/index.html') return render(request, 'login.html') 类上 @method_decorator(login_required, name='get') class LoginView(View): def dispatch(self, request, *args, **kwargs): return super(LoginView, self).dispatch(request, *args, **kwargs) def get(self, request): return render(request, 'login.html') def post(self, request): # request.GET # request.POST # 请求头中的:content-type # request.body user = request.POST.get('user') pwd = request.POST.get('pwd') if user == 'alex' and pwd == "alex3714": # 生成随机字符串 # 写浏览器cookie: session_id: 随机字符串 # 写到服务端session: # { # "随机字符串": {'user_info':'alex} # } request.session['user_info'] = "alex" return redirect('/index.html') return render(request, 'login.html') 特殊:CSRF Token只能加到dispatch from django.views.decorators.csrf import csrf_exempt, csrf_protect class LoginView(View): @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super(LoginView, self).dispatch(request, *args, **kwargs) def get(self, request): return render(request, 'login.html') def post(self, request): # request.GET # request.POST # 请求头中的:content-type # request.body user = request.POST.get('user') pwd = request.POST.get('pwd') if user == 'alex' and pwd == "alex3714": # 生成随机字符串 # 写浏览器cookie: session_id: 随机字符串 # 写到服务端session: # { # "随机字符串": {'user_info':'alex} # } request.session['user_info'] = "alex" return redirect('/index.html') return render(request, 'login.html')
注:
form表单提交: GET,POST ***
Ajax提交数据: GET,POST
['get'获取, 'post'创建, 'put'更新, 'patch'局部更新, 'delete'删除, 'head', 'options', 'trace'] -> restful规范
Django请求的生命周期:
wsgi -> 中间件 -> 路由系统 -> 视图函数(ORM,Template,渲染)
- wsgiref
- uwsgi