從零開始學Python-day9

Python-day9


學習要有定位,明確目標地去學習。堅持下去,就會有所收穫---leaves。(ps:現在思路已經稍微清晰點了,加油,時間不等人!!)


python08 -- 登錄模塊,Session以及初識jQuery


一、登錄模塊


1.1 登錄模塊MVC思路講解

    I:前端html

    a.登錄頁面首次默認GET方式,返回一個待填寫的表單;

    b.輸入用戶名密碼後,點擊表單按鈕以POST方式向邏輯端發起請求,並把表單數據傳遞給邏輯端


    II:邏輯端

    a.邏輯端判斷前端發起的是POST表單提交還是GET方式。如果爲GET請求,說明爲第一次發起,返回對應的html即可;如果爲POST請求,說明是爲了提交表單數據,通過request.form獲取表單數據。

    b.邏輯端查詢數據庫數據,判斷前端傳來的數據是否在數據庫中存在,如果存在,表示登錄成功,生成session,將用戶需要的信息存入session即可,如果不存在,則跳轉到登錄頁面重新輸入用戶名密碼


    III:數據端

    a.對數據進行增刪改查,並返回結果。


1.2 登錄的代碼

    login_user = dict( (k,v[0]) for k ,v in dict(request.form).items())

    ##一步高階代碼將用戶名密碼轉換爲字典


1.2.1 flask代碼

@app.route('/login',methods = ["GET","POST"])
def login():
        if request.method == "GET":
                return render_template("login.html")
        if request.method == "POST":
                login_user = dict( (k,v[0]) for k ,v in dict(request.form).items())
                tmp = ["name",'password']
                all_sql = "select %s from users " %','.join(tmp)
                cur.execute(all_sql)
                res = cur.fetchall()
                all_user = [ dict((v,row[k]) for k ,v in enumerate(tmp)) for row in res]
                #all_user==>[{'password': u'aa', 'name': u'KK'}, {'password': u'123456', 'name': u'TT'}, {'password': u'XX123as', 'name': u'XX'}, {'password': u'123as', 'name': u'Xman'}, {'password': u'123VV', 'name': u'AA'}]
                userName = [ x['name'] for x in all_user]
                if not login_user['name'] or not login_user['password']:
                        errmsg = "Name or Password not Null"
                        return render_template("login.html",result = errmsg)
                if  login_user['name'] not in userName:
                                                                                                    39,2-16       15%
                        errmsg = "Name is not exit"
                        return render_template("login.html",result = errmsg)
                else :

                        password = [ x['password'] for x in all_user if x['name'] == login_user['name']][0]
                        if  login_user['password'] != password:
                                errmsg = "Password is not exist "
                                return render_template("login.html",result = errmsg)
                        #return render_template("login.html",result = 'login Success')
                        else:
                                session['name'] = login_user['name']
                                return redirect('/user/userlist')


1.2.2 前端html代碼

[root@xiaowei blog]# cat templates/login.html
<html>
<head>
<meta charset='utf-8'>
<title>login</title>
</head>
<body>
<table>
<form action='/login' method="POST">
	<tr><td>Name<input id ="name"  type='text' name='name'> </td></tr>
	<tr><td>Password<input id ="password" type='password' name='password'> </td></tr>
	<tr><td><input id ="loginbtn" type='submit' value='login'></td></tr>
	</form>
	
	{% if result %}
	
	<div style = "color:red">
	{{ result }}
	</div><!--定義div標籤使報錯信息爲紅色-->
	{% endif %}<!--判斷是否存在報錯信息-->
</table>


1.2.3 登錄功能演示

    情況一:用戶名密碼都爲空

wKioL1hsbCeRKQLqAAAVjBeUxhc241.png

    

    情況二:用戶名不存在

wKioL1hsbjCQitA7AAAWpHhwT5M081.png


    情況三:密碼不正確

    wKioL1hsblbDA1sPAAAV8gT8RW8461.png

    

    情況四:用戶名密碼正確,跳轉用戶列表界面

    wKioL1hsbp6hIf6BAADVTgFWAs4824.png

1.3 登錄注意事項

    判斷用戶名密碼時優先使用get(方法)。

    if not login_user['name'] or not login_user['password']: ===>更改爲login_user.get('name',None)以防name字段不存在產生的報錯終止程序運行


二、Session講解


2.1 session定義

  session就是一個全局的字典,在整個flask頁面中都能調用,一般在登錄成功後生成session。session[key] = value。舉例說明:整個flask頁面就相當於一家大公司有很多棟樓,每個樓層都有門衛,Session就是第一個門衛給你發的一個通行證,帶着這個通行證就能各個樓層轉了。


2.2 爲什麼需要session

    session的主要作用是狀態保持,http請求是無狀態的。(從第一個門進去之後,每個門衛都是不可能都認識你,所以每次都要詢問你下)


2.3 Session的工作流程

    1.登錄成功生成session,用戶帶着session(通行證)去各個頁面

    2.各個頁面都有個門衛,專門檢查session(通行證),有則放行。

    3.出門的時候就會收回通行證


2.4 session的主要功能

    1.創建session

    2.刪除session

    3.驗證

        3.1 驗證用戶是否登錄,如果沒有登錄則跳轉回登錄頁面

        3.2 驗證權限、驗證角色。不同的角色操作不同的方法。


2.5 session實現思路

    1.用戶登錄後在全局大字典session裏面加一個值

    eg:session['name'] = 'wd',這個全局大字典在邏輯端任何地方都可以調用

    

    2.每個增刪改查操作前,都判斷下session裏面有沒有name這個字段值,如果有就表示已經登錄;沒有就表示未登錄,跳轉到登錄頁面。


2.6 session操作實例

    1.導入session

    from flask import session 

    app.secret_key = "asdasd!@#" #給加密字符串賦值


    2.session賦值

    session就是一個全局的字典,在整個flask頁面中都能調用,一般在登錄成功之後生成session.session[key] = value 

    本片中登錄模塊Session賦值爲session['name'] = login_user['name']

    

    3.session 驗證

    登錄成功後,其他所有的操作都必須基於session認證後實現。即session存在,允許操作;否則,跳轉回登錄界面。

    本例中session驗證爲在其他監聽路由下添加以下代碼:

        if not session.get('name',None):

                return redirect('/login')

    4.session註銷

    session註銷有兩種方式

    1.根據時間,生成session是帶上時間參數,對比時間過期,session自動註銷。(目前瞭解,暫無實現思路)

    2.手動註銷Session

    新建loginout路由,手動註銷session

@app.route('/loginout')
def loginout():
        session.pop('name')
        return redirect('/login')


2.7 session的效果圖

    1.session不存在的話,任何增刪改查操作都會跳轉回登錄頁面

wKiom1hsepOAVKFWAABj4F5Kt_4520.png

    2.session存在的情況下,可以進行任意跳轉,進入任何路由

wKiom1hsewmCWZC7AAFmj3sHIX8305.png


wKiom1hse6yhPHY7AACg2McwYUc269.png


三、初識jQuery

3.1 jQuery定義

    jQuery是一個"寫的更少,但是做的更多"的輕量級JavaScript庫。包含內容爲:

    HTML元素選取

    HTML元素操作

    CSS操作

    HTML事件函數

    JavaScript特效和動畫

    HTML DOM遍歷和修改

    AJAX

    


3.2 jQuery準備工作

    1.在項目目錄中創建static/js目錄 ==>mkdir -p static/js


    2.下載jQuery插件 ==> wget https://code.jquery.com/jquery-3.1.0.min.js


     3. 檢查目錄結構爲:     

    [root@xiaowei ketang]# tree  static/

    static/

    └── js

       └── jquery-3.1.0.min.js


3.3 jQuery三步走

    jQuery格式: $selector().action()

    

    1. $ 美元符,表示jQuery

    2. selector 選擇器(選定HTML元素),這個是重點。很多種選擇方式,id等

    3. action()選定後對這個元素的操作


    jQuery的基本三步走策略:

    I:選擇器--找到需要操作的元素


    II:操作 -- DOM元素進行增刪改查

        2.1 操作HTML文檔內容--常用元素table、form、 div

        2.2 操作HTML元素屬性 ---常見屬性

        2.3 操作HTML元素式樣 ---CSS(其實也屬於屬性)


    III:事件---什麼情況下觸發jQuery的操作,ajax等


3.4 第一個jQuery程序

    在login.html中添加以下內容

<script src = "/static/js/jquery-3.1.0.min.js"></script> #定義js文件內容
<script>
alert('di yi ge jQuery')

</script>


    執行效果截圖:

wKioL1hsiD3AeCQUAAIL3s_YvCc035.png

3.5 jQuery實現對HTML元素的操作

    jQuery實現對HTML元素進行取值,在login.html文件中將form及其內部標籤添加id元素。具體html代碼如下

    

    jQuery選擇器之ID:是html元素的唯一標識,同一個頁面中不能出現重名的idName


<html>
<head>
<meta charset='utf-8'>
<title>login</title>
</head>
<body>
<table>
<!--<form action='/login' method="POST">-->
<form id="loginForm">
        <tr><td>Name<input id ="name"  type='text' name='name'> </td></tr>
        <tr><td>Password<input id ="password" type='password' name='password'> </td></tr>
        <tr><td><input id ="loginbtn" type='submit' value='login'></td></tr>
        </form>
        {% if result %}
        <div style = "color:red">
        {{ result }}
        </div>
        {% endif %}
<script src = "/static/js/jquery-3.1.0.min.js"></script>
<script>
alert('di yi ge jQuery')

</script>
</table>


    驗證:運行程序,在login.html界面中輸入用戶名密碼,在console中輸入以下命令看能否獲取值。ps:form標籤的id值爲 loginForm,input標籤中用戶名密碼的id分別爲name和password。也可以通過id值對html元素值進行修改。$('#loginForm').serialize()執行結果爲"name=nihao&password=asdfa"  可以用來拼接html的url.


    

    jQuery中對數據的操作

    1.val()  操作表單數據

    2.html()  操作元素

    3.attr()  操作屬性

$('#loginForm').serialize()
"name=aaaa&password=dddd"
$('#loginForm').serialize()
"name=aaaa&password=dddd"
$('#name').val()
"aaaa"
$('#password').val()
"dddd"

    通過id修改元素值

wKiom1hsmC-Qu4ElAADBv8HKDz8714.png


3.6 jQuery實現登錄模塊

    jQuery實現登錄需要注意的知識點:

    1.flask邏輯端return 返回字典類型數據:eg : return json.dumps({'code':0,'result': "login success "}) ,對應的需要import json模塊。


    2.html中script標籤內的回調函數。要jQuery代碼邏輯。


3.6.1 jQuery實現登錄的前後端代碼:

##flask邏輯端代碼(僅登錄模塊)
##注意在開始要import json

@app.route('/login',methods = ["GET","POST"])
def login():
        if request.method == "GET":
                return render_template("login.html")
        if request.method == "POST":
                data = dict( (k,v[0]) for k ,v in dict(request.form).items())
                tmp = ["name",'password']
                all_sql = "select %s from users " %','.join(tmp)
                cur.execute(all_sql)
                res = cur.fetchall()
                all_user = [ dict((v,row[k]) for k ,v in enumerate(tmp)) for row in res]
                #all_user==>[{'password': u'aa', 'name': u'KK'}, {'password': u'123456', 'name': u'TT'}, {'password': u'XX123as', 'name': u'XX'}, {'password': u'123as', 'name': u'Xman'}, {'password': u'123VV', 'name': u'AA'}]
                userName = [ x['name'] for x in all_user]
                if not data.get('name',None)  or not data.get('password',None):
                        errmsg = "Name or Password not Null"
                        #return render_template("login.html",result = errmsg)
                        return json.dumps({'code':1,'result': errmsg})
                if  data.get('name',None) not in userName:
                        errmsg = "Name is not exit"
                        #return render_template("login.html",result = errmsg)
                        return json.dumps({'code':1,'result': errmsg})
                else :

                        password = [ x['password'] for x in all_user if x['name'] == data['name']][0]
                        if  data.get('password',None) != password:
                                errmsg = "Password is not exist "
                                #return render_template("login.html",result = errmsg)
                                return json.dumps({'code':1,'result': errmsg})
                        #return render_template("login.html",result = 'login Success')
                        else:
                                session['name'] = data['name']
                                #return redirect('/user/userlist')
                                return json.dumps({'code':0,'result': "login success "})
                                
##login.html前端HTML中代碼
<html>  
<head>  
<meta charset='utf-8'>
<title>login</title>
</head>
<body>
<table>
<!--<form action='/login' method="POST">-->
<form id="loginForm">
        <tr><td>Name<input id ="name"  type='text' name='name'> </td></tr>
        <tr><td>Password<input id ="password" type='password' name='password'> </td></tr>
        <tr><td><input id ="loginbtn" type='submit' value='login'></td></tr>
        </form>
        {% if result %}
        <div style = "color:red">
        {{ result }}
        </div>
        {% endif %}
<script src = "/static/js/jquery-3.1.0.min.js"></script>
<script>
//alert('di yi ge jQuery') <!--Test jQuery-->
$('#loginbtn').on('click',function(){
        var str = $('#loginForm').serialize()
        console.log(str)
        $.post('/login',str,function(data){   //回調函數,注意function(data)中data參數不能丟
                console.log(data)
                data = JSON.parse(data)
                console.log(data)
                if (data['code'] == 0){
                        alert(data['result'])
                        location.href='/user/userlist'
                }else{
                        $('errmsg').html(data['errmsg'])
                }
        })
        return  false 

})

</script>
</body>
</table>


3.6.2 jQuery登錄效果截圖

    1.錯誤信息截圖

wKiom1hsqsuDEHzkAADqI-Fj3Z8554.png


   2.正常登錄效果圖(點擊確認後跳轉到userlist界面)

wKiom1hsqzjwoXCaAAE2tHVCgFU714.png

wKioL1hsq5OgeA1XAAIG4U4vHkE343.png-wh_50


3.6.2 jQuery實現登錄重點

    回調函數:function(data爲回調函數)(ps:flask 端代碼無需更改,只是將html中事件響應更改爲jQuery。)

##login.html

<script>

//alert('di yi ge jQuery') <!--Test jQuery-->

$('#loginbtn').on('click',function(){

        var str = $('#loginForm').serialize()

        console.log(str) ##實現記錄$('#loginForm').serialize()的值

        $.post('/login',str,function(data){

                console.log(data)

                data = JSON.parse(data)

                console.log(data)

                if (data['code'] == 0){

                        alert(data['result']) #事件觸發以及展示信息

                        location.href='/user/userlist' ##事件完成後跳轉到用戶列表

                }else{

                       // $('errmsg').html(data['errmsg']) #console窗口打印$('#loginForm').serialize()內容

                       //以下更改使得報錯信息也在jQuery彈框中顯示。

                   alert(data['result'])

                        location.href='/login'



                }

        })

        return  false 


})


</script>







四、其他注意事項及知識點:

    1.對數據庫的操作,try except 方便排錯


     2.flask代碼組織結構有兩種方式      包 + 藍圖


       3.session後期可以通過使用裝飾器來包裝




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章