一、绪论:
简易实现登录功能demo,并没有使用默认身份验证模块,所以做的也很差,关闭了csrf保护,没有认证处理cookie和session,只是简单实现了功能。另外所谓的验证码功能是伪的。
二、
app下的views.py models.py functionlib.py:
1 #-*- coding:utf-8 -*- 2 from functionlib import gethash 3 from django.shortcuts import render,render_to_response 4 from django.http import HttpResponse,HttpResponseRedirect 5 from models import LoginUser 6 7 8 9 # Create your views here. 10 11 def register(request): 12 if request.method != 'POST': 13 return render_to_response("register.html") 14 else: 15 username = request.POST["user"] 16 password = request.POST["pswd"] 17 emailstr = request.POST["email"] 18 phonestr = request.POST["phone"] 19 if None in [username,password,emailstr,phonestr]: 20 return render_to_response("register.html") 21 else: 22 password = gethash(password) 23 print "ok" 24 try: 25 LoginUser.objects.create(username=username,password=password,emailstr=emailstr,phonestr=phonestr) 26 except Exception,ex: 27 return render_to_response("register.html") 28 return HttpResponseRedirect("/login") 29 30 def login(request): 31 print request.COOKIES 32 if request.method != 'POST': 33 response = render_to_response("login.html") 34 response.set_cookie("login_name",None) 35 response.set_cookie("login_flag","0")
35 return response 36 else: 37 if request.COOKIES.get("login_flag") == "1": 38 loginname = request.COOKIES.get("login_name") 39 return HttpResponseRedirect("/mainpage?name=%s"%loginname) 40 else: 41 user = request.POST["user"] 42 pswd = request.POST["pswd"] 43 obj = LoginUser.objects.get(username=user) 44 if obj.password == gethash(pswd): 45 response = HttpResponseRedirect("/verifycode") 46 response.set_cookie("login_name",user) 47 return response 48 else: 49 return HttpResponseRedirect("/login") 50 51 def verify(request): 52 if request.method != 'POST': 53 return render_to_response("verify.html") 54 else: 55 if request.POST["code"] == "bobac": 56 user = request.COOKIES.get("login_name") 57 print user 58 print request.COOKIES 59 if user == None: 60 return HttpResponseRedirect("/login") 61 response = HttpResponseRedirect("/mainpage?name=%s"%user) 62 response.set_cookie("login_flag","1") 63 return response
63 else:
63 return HttpResponseRedirect("/verifycode") 64 65 def main(request): 66 if request.COOKIES.get("login_flag") == "1": 67 return HttpResponse("Welcome %s!"%request.GET["name"]) 68 else: 69 return HttpResponseRedirect("/login") 70 71
1 from django.db import models 2 3 # Create your models here. 4 5 class LoginUser(models.Model): 6 username = models.CharField(max_length=20) 7 password = models.CharField(max_length=64) 8 emailstr = models.CharField(max_length=50) 9 phonestr = models.CharField(max_length=12)
1 import hashlib 2 3 def gethash(text): 4 md5 = hashlib.md5() 5 md5.update(text) 6 return md5.hexdigest()
mysite1下的settings.py 和 urls.py
1 """ 2 Django settings for mysite1 project. 3 4 Generated by 'django-admin startproject' using Django 1.8. 5 6 For more information on this file, see 7 https://docs.djangoproject.com/en/1.8/topics/settings/ 8 9 For the full list of settings and their values, see 10 https://docs.djangoproject.com/en/1.8/ref/settings/ 11 """ 12 13 # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 14 import os 15 16 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 18 19 # Quick-start development settings - unsuitable for production 20 # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ 21 22 # SECURITY WARNING: keep the secret key used in production secret! 23 SECRET_KEY = 't!+*ii3=^bpde5_&sehb41uqn0^tfe_1x#ews9banz1!q$bo)2' 24 25 # SECURITY WARNING: don't run with debug turned on in production! 26 DEBUG = True 27 28 ALLOWED_HOSTS = [] 29 30 31 # Application definition 32 33 INSTALLED_APPS = ( 34 'django.contrib.admin', 35 'django.contrib.auth', 36 'django.contrib.contenttypes', 37 'django.contrib.sessions', 38 'django.contrib.messages', 39 'django.contrib.staticfiles', 40 'myapp1' 41 ) 42 43 MIDDLEWARE_CLASSES = ( 44 'django.contrib.sessions.middleware.SessionMiddleware', 45 'django.middleware.common.CommonMiddleware', 46 #'django.middleware.csrf.CsrfViewMiddleware', 47 'django.contrib.auth.middleware.AuthenticationMiddleware', 48 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 49 'django.contrib.messages.middleware.MessageMiddleware', 50 'django.middleware.clickjacking.XFrameOptionsMiddleware', 51 'django.middleware.security.SecurityMiddleware', 52 ) 53 54 ROOT_URLCONF = 'mysite1.urls' 55 56 TEMPLATES = [ 57 { 58 'BACKEND': 'django.template.backends.django.DjangoTemplates', 59 'DIRS': [BASE_DIR+"/templates/"], 60 'APP_DIRS': True, 61 'OPTIONS': { 62 'context_processors': [ 63 'django.template.context_processors.debug', 64 'django.template.context_processors.request', 65 'django.contrib.auth.context_processors.auth', 66 'django.contrib.messages.context_processors.messages', 67 ], 68 }, 69 }, 70 ] 71 72 WSGI_APPLICATION = 'mysite1.wsgi.application' 73 74 75 # Database 76 # https://docs.djangoproject.com/en/1.8/ref/settings/#databases 77 78 DATABASES = { 79 'default': { 80 'ENGINE': 'django.db.backends.mysql', 81 'NAME': 'mysite1', 82 'USER': 'root', 83 'HOST': '127.0.0.1', 84 'PORT': 3306, 85 } 86 } 87 88 89 # Internationalization 90 # https://docs.djangoproject.com/en/1.8/topics/i18n/ 91 92 LANGUAGE_CODE = 'en-us' 93 94 TIME_ZONE = 'UTC' 95 96 USE_I18N = True 97 98 USE_L10N = True 99 100 USE_TZ = True 101 102 103 # Static files (CSS, JavaScript, Images) 104 # https://docs.djangoproject.com/en/1.8/howto/static-files/ 105 106 STATIC_URL = '/static/'
1 from django.conf.urls import include, url 2 from django.contrib import admin 3 from myapp1 import views 4 5 urlpatterns = [ 6 # Examples: 7 # url(r'^$', 'mysite1.views.home', name='home'), 8 # url(r'^blog/', include('blog.urls')), 9 10 url(r'^admin/', include(admin.site.urls)), 11 url(r'^register/', "myapp1.views.register"), 12 url(r'^login/', "myapp1.views.login"), 13 url(r'^mainpage/', "myapp1.views.main"), 14 url(r'^verifycode/', "myapp1.views.verify"), 15 ]
templates下几个静态文件:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>陈然的网站注册</title> 5 </head> 6 <body> 7 <center> 8 <form action="http://127.0.0.1:8000/register/" method="post"> 9 <p>用户名:<input type="text" name="user"/></p> 10 <p>密 码:<input type="password" name="pswd"/></p> 11 <p>邮 箱:<input type="text" name="email"/></p> 12 <p>手 机:<input type="text" name="phone"/></p> 13 <input type="submit" value="注册"> 14 15 </form> 16 </center> 17 </body> 18 </html>
<!DOCTYPE html> <html> <head> <title>陈然的网站登录</title> </head> <body> <center> <form action="http://127.0.0.1:8000/login/" method="post"> <p>用户名:<input type="text" name="user"/></p> <p>密 码:<input type="password" name="pswd"/></p> <input type="submit" value="登录"> </form> </center> </body> </html>
总结知识点
1、神坑:html中action的url最后要加/否则会有报错
2、重定向和返回文件:
1 #1返回静态文件: 2 render_to_response("index.html") 3 #这个路径在settings.py中保存在templates的DIR list中 4 5 #2重定向: 6 HttpResponseRedirect("/main/xxx")#参数是相对URL
3、后台管理:
1 python manage.py migrate #创建默认数据库 2 python manage.py createsuperuser#创建超级用户管理后台的 3 python manage.py makemigrations myapp1#更新app库结构 4 python manage.py migrate myapp1#创建app的库表结构