基於ajax實現的登錄


一、需要知道的新知識點

1、刷新驗證碼。給src屬性加一個?號。加個?會重新去請求

        //#給驗證碼刷新
        $(".vialdCode_img").click(function () {
         方式一:dom方法#}
            $(this)[0].src+="?"#}
         方式二:jQuery的attr方法#}
            $(this).attr("src",$(this).attr("src")+'?')
        })
    }) 

2、當登錄成功跳轉,或者注冊成功跳轉

 $(".register").click(function () {
            location.href = '/register/'
  });

3、超時后消失

setTimeout(foo, 3000)
function foo() {
                $(".error").html("")
            }

4、auth模塊的使用

模塊的導入:

from django.contrib import auth

幾個使用方法:

1 、authenticate()   :驗證用戶輸入的用戶名和密碼是否相同

提供了用戶認證,即驗證用戶名以及密碼是否正確,一般需要username  password兩個關鍵字參數

user = authenticate(username='someone',password='somepassword')

2 、login(HttpRequest, user):登錄  

該函數接受一個HttpRequest對象,以及一個認證了的User對象

此函數使用django的session框架給某個已認證的用戶附加上session id等信息。

from django.contrib.auth import authenticate, login
   
def my_view(request):
  username = request.POST['username']
  password = request.POST['password']
  user = authenticate(username=username, password=password)
  if user:
    login(request, user)
    # Redirect to a success page.
    ...
  else:
    # Return an 'invalid login' error message.
    ...
復制代碼

3 、logout(request)  注銷用戶 

該函數接受一個HttpRequest對象,無返回值。當調用該函數時,當前請求的session信息會全部清除。該用戶即使沒有登錄,使用該函數也不會報錯。

from django.contrib.auth import logout
   
def logout_view(request):
  logout(request)
  # Redirect to a success page.

4 、user對象的 is_authenticated()

要求:

  1、用戶登錄后才能訪問某些頁面

  2、如果用戶沒有登錄就訪問該頁面的話直接跳轉登錄頁面

  3、用戶在跳轉的登錄界面中完成登錄后,自動訪問跳轉到之前訪問的地址

def my_view(request):
  if not request.user.is_authenticated():
    return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

在后台用request.user.is_authenticated()判斷用戶是否已經登錄,如果true則可以向前台展示request.user.name

USer對象的幾個方法

2.2 、創建用戶:create_user 

from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')

2.3 、check_password(passwd):密碼檢查

用戶需要修改密碼的時候 首先要讓他輸入原來的密碼 ,如果給定的字符串通過了密碼檢查,返回 True

2.4 、修改密碼: set_password() 

user = User.objects.get(username='')
user.set_password(password='')
user.save 

二、具體實現的登錄

urls.py

1 urlpatterns = [
2     url(r'^admin/', admin.site.urls),
3     url(r'^login/$', views.login),
4     url(r'^index/$', views.index),
5     url(r'^get_vaildCode_img/$', views.get_vaildCode_img),
6     url(r'^log_out/$', views.log_out),
7     
url.py

view.py

 1 def login(request):
 2     if request.method=="GET":
 3         return render(request, "login.html")
 4     else:
 5         username = request.POST.get("username")
 6         password = request.POST.get("password")
 7         vialdCode = request.POST.get("vialdCode")
 8         ret = {"flag":False,"error_msg":None}
 9         if vialdCode.upper() == request.session.get("keep_valid_code").upper():
10             user = auth.authenticate(username=username, password=password)
11             if user:
12                 #如果驗證成功就讓登錄
13                 auth.login(request,user)
14                 ret["flag"] = True
15             else:
16                 ret["error_msg"] = "用戶名和密碼錯誤"
17         else:
18             ret["error_msg"] = "驗證碼錯誤"
19     return HttpResponse(json.dumps(ret))
20 
21 def index(request):
22     #驗證是不是當前進來的那個用戶,如果用戶已經登錄了就可以看到頁面
23     # 如果沒有登錄就不讓看見主頁面,就直接返回登錄頁面
24     if not request.user.is_authenticated():
25         return redirect("/login/")
26     else:
27         return render(request, "index.html")
28 
29 def log_out(request):
30     auth.logout(request)
31     return redirect("/login/")
32 def get_vaildCode_img(request):
33     # 方式一:這樣的方式吧路徑寫死了,只能是那一張圖片
34     # import os
35     # path = os.path.join(settings.BASE_DIR,"static","image","3.jpg")
36     # with open(path,"rb") as f:
37     #     data = f.read()
38     # return HttpResponse(data)
39     # 方式二:每次都顯示不同的圖片,利用pillow模塊,安裝一個pillow模塊
40     # from PIL import Image
41     # img = Image.new(mode="RGB",size=(120,40),color="green") #首先自己創建一個圖片,參數size=(120,40) 代表長和高
42     # f = open("validcode.png","wb")#然后把圖片放在一個指定的位置
43     # img.save(f,"png")  #保存圖片
44     # f.close()
45     # with open("validcode.png","rb") as f:
46     #     data = f.read()
47     # return HttpResponse(data)
48     # 方式三:
49     # 方式二也不怎么好,因為每次都要創建一個保存圖片的文件,我們可以不讓吧圖片保存到硬盤上,
50     # 在內存中保存,完了自動清除,那么就引入了方式三:利用BytesIO模塊
51     # from io import BytesIO
52     # from PIL import Image
53     # img = Image.new(mode="RGB",size=(120,40),color="blue")
54     # f = BytesIO()  #內存文件句柄
55     # img.save(f,"png")  #保存文件
56     # data = f.getvalue()#打開文件(相當於python中的f.read())
57     # return HttpResponse(data)
58 
59     # 方式四:1、添加畫筆,也就是在圖片上寫上一些文字
60     #         2、並且字體隨機,背景顏色隨機
61     from io import BytesIO
62     from PIL import Image,ImageDraw,ImageFont
63     import random
64     #隨機創建圖片
65     img = Image.new(mode="RGB",size=(120,40),color=(random.randint(0,255),random.randint(0,255),random.randint(0,255)))
66     draw = ImageDraw.Draw(img,"RGB")
67     # 畫干擾線
68     for i in range(5):
69         x1 = random.randint(0, 120)
70         y1 = random.randint(0, 40)
71         x2 = random.randint(0, 120)
72         y2 = random.randint(0, 40)
73 
74         draw.line((x1, y1, x2, y2), fill=(random.randint(0,255),random.randint(0,255),random.randint(0,255)))
75 
76     font = ImageFont.truetype("static/font/kumo.ttf",20)  #20表示20像素
77 
78     str_list = []  #吧每次生成的驗證碼保存起來
79     # 隨機生成五個字符
80     for i in range(5):
81         random_num = str(random.randint(0, 9))  # 隨機數字
82         random_lower = chr(random.randint(65, 90))  # 隨機小寫字母
83         random_upper = chr(random.randint(97, 122))  # 隨機大寫字母
84         random_char = random.choice([random_num, random_lower, random_upper])
85         print(random_char,"random_char")
86         str_list.append(random_char)
87         # (5 + i * 24, 10)表示坐標,字體的位置
88         draw.text((5+i*24,10),random_char,(random.randint(0,255),random.randint(0,255),random.randint(0,255)),font=font)
89     print(str_list,"str_list")
90     f = BytesIO()#內存文件句柄
91     img.save(f,"png")   #img是一個對象
92     data = f.getvalue()  #讀取數據並返回至HTML
93     valid_str = "".join(str_list)
94     print(valid_str,"valid_str")
95     request.session["keep_valid_code"] = valid_str   #吧保存到列表的東西存放至session中
96     return HttpResponse(data)
view.py

template

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6     <meta name="viewport" content="width=device-width">
  7     <title>Title</title>
  8     <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
  9     <link rel="stylesheet" href="/static/css/login.css">
 10 </head>
 11 <body>
 12 <div class="container">
 13     <div class="row">
 14         <div class="col-md-1=10">
 15             <form class="form-horizontal" id="form_data" action="/login/" method="post">
 16                 {% csrf_token %}
 17                 <div class="form-group">
 18                     <label for="username" class="col-sm-2 control-label">用戶名</label>
 19                     <div class="col-sm-5">
 20                         <input type="text" class="form-control" id="username" placeholder="username" name="username">
 21                     </div>
 22                 </div>
 23                 <div class="form-group">
 24                     <label for="password" class="col-sm-2 control-label">密碼</label>
 25                     <div class="col-sm-5">
 26                         <input type="password" class="form-control" id="password" placeholder="password" name="password">
 27                     </div>
 28                 </div>
 29                 <div class="form-group">
 30                     <div class="row">
 31                         <div class="col-md-6 col-md-offset-1">
 32 {#                            文字部分#}
 33                             <label for="vialdCode" class="col-sm-2 control-label">驗證碼</label>
 34                              <div class="col-sm-5">
 35                                 <input type="text" class="form-control vialdCode_text" id="vialdCode" placeholder="驗證碼" name="vialdCode">
 36                             </div>
 37 {#                            圖片部分#}
 38                              <div class="col-md-5">
 39                             <img class="vialdCode_img" src="/get_vaildCode_img/" alt="" width="200px" height="100px">
 40 {#                                 <a href=""></a>     #}
 41                         </div>
 42                         </div>
 43 
 44                     </div>
 45                 </div>
 46                 <div class="form-group">
 47                     <div class="col-sm-offset-2 col-sm-10">
 48                         <div class="checkbox">
 49                             <label>
 50                                 <input type="checkbox"> 下次自動登錄
 51                             </label>
 52                         </div>
 53                     </div>
 54                 </div>
 55                 <div class="form-group">
 56                     <div class="col-sm-offset-2 col-sm-10">
 57                         <p>
 58                             <button type="button" class="btn btn-success login">登錄</button>
 59                             <span class="error has-error"></span></p>
 60                         <p>
 61                             <button type="button" class="btn btn-primary register">注冊</button>
 62                         </p>
 63                     </div>
 64                 </div>
 65             </form>
 66         </div>
 67     </div>
 68 </div>
 69 <script src="/static/jquery-3.2.1.min.js"></script>
 70 <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
 71 <script src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js"></script>
 72 
 73 <script>
 74     $(function () {
 75         //給登錄按鈕增加事件
 76         $(".login").click(function () {
 77             function foo() {
 78                 $(".error").html("")
 79             }
 80 
 81             //用post的話就可以不用ajax了,ajax里面都包括了
 82             $.post({
 83                 url: '/login/',
 84                 headers: {"X-CSRFToken": $.cookie('csrftoken')},
 85                 data: $("#form_data").serialize(),
 86                 {#            contentType:'application/json',#}
 87                 success: function (data) {
 88                     var data = JSON.parse(data);
 89                     console.log(typeof data);
 90                     if (data["flag"]) {
 91                         window.location.href = '/index/'
 92                     }
 93                     else {
 94                         $(".error").html(data["error_msg"]);
 95                         setTimeout(foo, 3000)
 96                     }
 97                 }
 98             })
 99         });
100 
101         //給注冊按鈕增加事件
102         $(".register").click(function () {
103             window.location.href = '/register/'
104         });
105 
106         //#給驗證碼刷新
107         $(".vialdCode_img").click(function () {
108 {#            方式一:dom方法#}
109 {#            $(this)[0].src+="?"#}
110 {#            方式二:jQuery的attr方法#}
111             $(this).attr("src",$(this).attr("src")+'?')
112         })
113     })
114 
115 </script>
116 </body>
117 </html>
login.html
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta http-equiv="X-UA-Compatible" content="IE=edge">
 6     <meta name="viewport" content="width=device-width">
 7     <title>Title</title>
 8 </head>
 9 <body>
10 <h1>hello{{ request.user.username }}</h1>
11 <button><a href="/log_out/">注銷</a></button>
12 </body>
13 </html>
index.html
 1 .container {
 2     margin-top: 100px;
 3     margin-left: 330px;
 4 }
 5 
 6 .error {
 7     color: red;
 8 }
 9 
10 .btn {
11     width: 200px;
12 }
13 .vialdCode_img{
14     width: 200px;
15     height: 40px;
16 }
login.css

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM