# 90 實戰項目-中國工商銀行登錄和轉賬實現
## ICDB.py
```text
from flask import Flask, render_template, views, request, session, redirect,url_for
from forms import RegistForm,LoginForm,TransferForm
from exts import db
import config
from models import User
from auth import login_required
app = Flask(__name__)
# 初始化app
db.init_app(app)
# 導入配置
app.config.from_object(config)
# 首頁
@app.route('/')
def index():
return render_template("index.html")
# 注冊模塊
class RegistView(views.MethodView):
# get請求
def get(self):
return render_template("regist.html")
# post請求
def post(self):
# request.form:獲取所有表單數據
# 將表單數據傳入RegistForm中進行驗證數據是否輸入正確
form = RegistForm(request.form)
# 如果驗證成功則會通過validate()方法返回一個True,反之False
if form.validate():
# 通過form.字段名.data獲取表單數據
email = form.email.data
username = form.username.data
password = form.password.data
deposit = form.deposit.data
# 創建user對象
user = User(email=email,username=username,password=password,deposit=deposit)
# 插入數據庫中
#-------------
# 添加對象
db.session.add(user)
# 提交到數據庫中
db.session.commit()
return "注冊成功"
else:
# form.errors:驗證失敗錯誤的原因
print(form.errors)
return "注冊失敗"
# 通過類,進行添加url
app.add_url_rule("/regist/",view_func=RegistView.as_view("regist"))
# 登錄
class LoginView(views.MethodView):
def get(self):
return render_template("login.html")
def post(self):
form = LoginForm(request.form)
if form.validate():
email = form.email.data
password = form.password.data
user = User.query.filter(User.email==email,User.password==password).first()
if user:
session["user_id"] = user.id
# return "登錄成功"
return redirect(url_for("index"))
else:
return "郵箱或密碼錯誤!"
else:
return render_template("login.html")
app.add_url_rule(rule="/login/",view_func=LoginView.as_view("login"))
# 轉賬
class TransferView(views.MethodView):
decorators = [login_required]
def get(self):
return render_template("transfer.html")
def post(self):
form = TransferForm(request.form)
if form.validate():
email = form.email.data
money = float(form.money.data)
user = User.query.filter(User.email==email).first()
print(user.deposit)
if user:
# 從會話中讀取用戶id
user_id = session.get("user_id")
# # 如果沒登錄就跳轉登錄頁面
# if user_id is None:
# return redirect(url_for("login"))
# print(user_id)
# User.query.get()以id進行查詢
myself = User.query.get(user_id)
print(type(myself.deposit))
if myself.deposit >= money:
user.deposit += money
myself.deposit -= money
db.session.commit()
return "轉賬成功"
else:
return "余額不足"
else:
return "該用戶不存在"
else:
return "數據填寫不正確"
app.add_url_rule(rule="/transfer/",view_func=TransferView.as_view("transfer"))
if __name__ == '__main__':
app.run(debug=True)
```
## transfer.html
```text
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>中國工商銀行轉賬頁面</title>
</head>
<body>
<form action="" method="post">
<table>
<tbody>
<tr>
<td>轉到郵箱:</td>
<td><input type="text" name="email"/></td>
</tr>
<tr>
<td>轉到金額:</td>
<td><input type="text" name="money"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="立即轉賬"/></td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
```
## forms.py
```text
# 字段類型
from wtforms import Form,StringField,FloatField,IntegerField
# 驗證
from wtforms.validators import Email,Length,EqualTo,InputRequired,NumberRange
# from models import User
class RegistForm(Form):
# 驗證是否是郵箱格式
email = StringField(validators=[Email()])
# 驗證輸入的長度是否達到3~20
username = StringField(validators=[Length(3,20)])
# 同上
password = StringField(validators=[Length(6, 20)])
# 驗證是否和password字段的值一樣
password_repeat = StringField(validators=[EqualTo("password")])
# 判斷是否輸入值
deposit = FloatField(validators=[InputRequired()])
class LoginForm(Form):
# 注意一定要Email填上括號
email = StringField(validators=[Email()])
password = StringField(validators=[Length(6,20)])
# # 自定義驗證器
# def validate_password(self):
# pass
# 驗證等同于post請求里面的驗證
# def validate(self):
# # 調用父類
# result = super(LoginForm,self).validate()
# if not result:
# return False
# # 獲取數據
# email = self.email.data
# password = self.password.data
# # 利用模型從數據庫中過濾信息
# user = User.query.filter(User.email == email,User.password == password).first()
# if not user:
# self.email.errors.append("郵箱或密碼錯誤")
# return False
# return True
class TransferForm(Form):
email = StringField(validators=[Email()])
money = FloatField(validators=[NumberRange(1,10000000)])
```
## login.html
```text
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>中國工商銀行登錄界面</title>
</head>
<body>
<form action="" method="post">
<table>
<tbody>
<tr>
<td>郵箱:</td>
<td><input type="text" name="email"/></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" valule="登錄"/></td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
```
## auth.py
```text
from functools import wraps
from flask import session
from flask import redirect,url_for
# 驗證,防止跨越權限訪問
def login_required(func):
@wraps(func)
def wrapper(*args,**kwargs):
user_id = session.get("user_id")
if user_id:
return func(*args,**kwargs)
else:
return redirect(url_for("login"))
return wrapper
```
- 介紹
- 1.Flask視圖和URL
- 01 虛擬環境
- 02 URL組成部分詳解
- 03 web服務器+應用服務器+web應用框架
- 04 flask程序詳解
- 05 debug模式詳解
- 06 配置文件兩種方式詳解
- 07 URL中兩種方式傳參
- 08 url_for使用詳解
- 09 自定義URL轉換器
- 10 必會的小細節知識
- 11 重定向詳解
- 12-13 視圖函數Response返回值詳解
- 2.Jinja2模版
- 14 Jinja2模板介紹
- 15 模板傳參及其技巧
- 16 模板中使用url_for
- 17 過濾器基本使用
- 18 default過濾器詳解
- 19 常用過濾器講解
- 20 自定義過濾器
- 21 自定義時間處理過濾器案例
- 22 if
- 23 for循環語句詳解
- 24 九九乘法表
- 25 宏的概念和基本使用
- 26 宏的導入和注意事項
- 27 include標簽使用詳解
- 28 set和with語句以及模板中定義變量
- 29 加載靜態文件
- 30 模板繼承詳解
- 31-36 豆瓣微信小程序案例
- 3.Flask視圖高級
- 37 add_url_rule和app.route原理剖析
- 38 標準類視圖及其使用場景
- 39 基于調度方法的類視圖
- 40 類視圖中使用裝飾器
- 41 藍圖的基本使用
- 42 藍圖中模版文件尋找規則
- 43 藍圖中靜態文件尋找規則
- 44 url_for反轉藍圖注意事項
- 45 子域名實現詳解
- 4.Flask數據庫
- 46 安裝MySQL以及注意事項
- 47 SQLAlchemy連接數據庫
- 48 ORM介紹
- 49 定義ORM模型并將其映射到數據庫中
- 50 SQLAlchemy對數據的增刪改查操作
- 51 SQLAlchemy屬性常用數據類型詳解
- 52 Column常用參數
- 53 query函數可查詢的數據
- 54 filter方法常用過濾條件
- 55 外鍵及其四種約束講解
- 56 ORM層外鍵和一對多關系
- 57 一對一關系實現
- 58 多對多關系實現
- 59 ORM層面刪除數據注意事項
- 60 relationship方法中的cascade參數詳解(1)
- 61 relationship方法中的cascade參數詳解(2)
- 62 三種排序方式詳解
- 63 limit、offset以及切片操作
- 64 數據查詢懶加載技術
- 65 group_by和having子句
- 66 join實現復雜查詢
- 67 subquery實現復雜查詢
- 68 Flask-SQLAlchemy的使用詳解
- 69 alembic數據庫遷移工具基本使用
- 70 alembic常用命令和經典錯誤解決辦法
- 71 Flask-SQLAlchemy下alembic的配置
- 72 Flask-Script詳細講解
- 73 項目結構重構
- 74 Flask-Migrate詳細講解
- 75 Flask-Migrate注意事項
- 5.Flask知識點補充
- WTForms
- 76 WTForms表單驗證基本使用
- 77 WTForms常用驗證器
- 78 自定義表單驗證器
- 79 使用WTForms渲染模版
- 上傳文件
- 80 上傳文件以及訪問上傳的文件
- 81 使用flask_wtf1驗證上傳的文件
- Flask Cookie
- 82 cookie的基本概念
- 83 Flask設置和刪除cookie|Flask設置cookie過期時間|設置Cookie的有效域名
- Flask Session
- 86 session的基本概念
- 87 Flask操作session
- CSRF攻擊與防御
- 88 CSRF攻擊原理
- 89 實戰項目-中國工商銀行注冊功能完成
- 90 實戰項目-中國工商銀行登錄和轉賬實現
- 91 實戰項目-病毒網站使用CSRF漏洞轉賬
- 92 CSRF防御原理
- 93 Flask中CSRF防御的方法與原理
- 94 AJAX處理CSRF漏洞
- Flask 上下文
- 95 Local線程隔離對象
- 96 app上下文和request上下文詳解
- 97 線程隔離的g對象使用詳解
- Flask鉤子函數
- 98 before_request鉤子函數詳解
- 99 context_processor鉤子函數詳解
- 100 errorhandler鉤子函數詳解
- Flask信號
- 101 信號機制及其使用場景詳解
- 102 Flask內置的信號講解
- Flask Restful
- 103 Restful API規范介紹
- 104 Flask-Restful插件的基本使用
- 105 Flask-Restful參數驗證
- 106 Flask-Restful標準化返回參數(1)
- 107 Flask-Restful標準化返回參數(2)
- 108 Flask-Restful細節強化
- 6.memcached緩存系統
- 109 memcached介紹
- 110 memcached的安裝和參數詳解
- 111 telnet操作memcached
- 112 Python操作memcached
- 113 memcached的安全機制
- 7.Redis鍵值對數據庫
- 114 Redis概述和使用場景介紹
- 115 Redis的安裝以及客戶端連接
- 116 Redis的字符串以及過期時間操作
- 117 Redis的列表操作
- 118 Redis的集合操作
- 119 Redis的哈希操作
- 120 Redis的事務操作
- 121 Redis的發布和訂閱操作
- 122 RDB和AOF的兩種數據持久化機制
- 123 Redis設置連接密碼
- 124 其他機器連接本機redis
- 125 Python操作redis
- 8.Flask企業級論壇實戰項目
- Flask項目實戰
- 126.實戰項目介紹
- 127.項目結構搭建
- 128.cms用戶模型定義
- 129.cms后臺登錄界面完成
- 130.cms后臺登錄功能完成
- 131.cms后臺登錄限制
- 132.cms后臺模版渲染完成
- 133.cms用戶名渲染和注銷功能實現
- 134.cms模版抽離和個人信息頁面完成
- 135.cms登錄頁面CSRF保護
- 136.cms后臺修改密碼界面布局完成
- 137.cms后臺修改密碼ajax功能完成
- 138.cms后臺密碼修改服務器邏輯完成
- 139.優化json數據的返回
- 140.sweetalert提示框用法講解
- 141.sweetalert優化修改密碼結果反饋
- 142.修改郵箱界面完成
- 143.Flask-Mail的使用以及郵箱配置
- 144.發送郵箱驗證碼功能完成
- 145.修改郵箱功能完成
- 146.二進制及其相關運算
- 147.權限和角色模型定義
- 148.封裝權限判斷功能
- 149.客戶端權限驗證功能完成
- 150.服務端權限驗證功能完成
- 151.前臺用戶模型創建(1)
- 152.前臺用戶模型創建(2)
- 153.注冊界面完成
- 154.圖形驗證碼生成技術詳解
- 155.點擊更換圖形驗證碼
- 156.發送短信驗證碼
- 157注冊頁面對接短信驗證碼接口
- 158.短信驗證碼接口加密和js代碼混淆
- 159.緩存驗證碼
- 160.注冊功能前端邏輯代碼完成
- 161.注冊功能后臺邏輯代碼完成
- 162.注冊完成跳轉回上一個頁面
- 163.登錄界面完成
- 164.登錄功能完成
- 165.首頁導航條實現和代碼抽離
- 166.首頁輪播圖實現
- 167.cms輪播圖管理頁面布局
- 168.cms添加輪播圖的模態對話框制作
- 169.cms添加輪播圖后臺邏輯代碼完成
- 170.cms添加輪播圖前臺邏輯代碼完成
- 171.cms編輯和刪除輪播圖功能完成
- 172.七牛云存儲介紹
- 173.七牛JS和Python的SDK使用
- 174.輪播圖上傳圖片功能完成
- 175.首頁動態獲取輪播圖數據
- 176.板塊管理(1)
- 177.板塊管理(2)
- 178.UEditor編輯器集成以及配置上傳文件到七牛
- 179.發布帖子后臺邏輯完成
- 180.發布帖子界面布局完成
- 181.發布帖子前端邏輯代碼完成
- 182.首頁帖子列表布局完成
- 183.帖子分頁技術實現
- 184.帖子板塊過濾顯示
- 185.帖子詳情頁布局
- 186.評論布局和功能實現(1)
- 187.評論布局和功能實現(2)
- 188.帖子加精和取消加精功能完成
- 189.帖子按照發布時間和評論數量等排序
- 190.celery實現異步任務
- 191.Flask+Celery實現郵件和短信異步發送
- ajax技術
- 192.Flask和Ajax技術
- 9.Python web開發核心技術
- 部署
- 193.開發機上的準備工作
- 194.服務器安裝Python和虛擬環境
- 195.服務器安裝ssh、git以及mysql
- 196.生產環境下項目的配置
- 197.uWSGI部署項目
- 198.uWSGI配置文件
- 199.nginx+uwsgi部署項目
- 200.supervisor管理uwsgi進程