flask基礎知識點
1.GET/POST
常用響應邏輯
響應物件 return response # 返回自定義的響應物件
返回JSON return jsonify(json_dict)
重定向 return redirect(‘http://www.itheima.com’)
url_for
自定義狀態碼本質仍是包裝為Reponse物件 return ‘狀態碼為 666’, 666
cookie
session
請求鉤子
SCSRF
二. CSRF CSRF:
跨站請求偽造, 是一種常見的攻擊網站的方式 是一種針對狀態保持的攻擊形式
- CSRF的攻擊過程 (重點) 黑客網站會使用表單的隱藏欄位來發起跨站請求 瀏覽器會執行該跨站請求, 並自動攜帶cookie到指定的路由, 由於cookie中儲存了當前使用者的 sid, 所以可以通過免密碼驗證, 直接實現轉賬處理
- CSRF保護 生成隨機令牌, 派發到cookie和表單中 在提交表單時, 驗證cookie和表單中儲存的令牌是否一致
ORM
建立表
db.create_all()
刪除表
db.drop_all()
插入一條資料
user = User(name=‘zs’)
db.session.add(user)
db.session.commit()
查詢所有使用者資料
User.query.all()
查詢有多少個使用者
User.query.count()
查詢第1個使用者
User.query.first()
查詢id為4的使用者[3種方式]
User.query.get(4)
User.query.filter_by(id=4).all()
User.query.filter(User.id==4).all()
查詢名字結尾字元為g的所有使用者[開始 / 包含]
User.query.filter(User.name.endswith(“g”)).all()
User.query.filter(User.name.startswith(“g”)).all()
User.query.filter(User.name.contains(“g”)).all()
查詢名字和郵箱都以li開頭的所有使用者[2種方式]
User.query.filter(User.name.startswith(“li”), User.email.startswith(“li”)).all()
User.query.filter(and_(User.name.startswith(“li”), User.email.startswith(“li”))).all()
查詢age是25 或者 email
以itheima.com
結尾的所有使用者
User.query.filter(or_(User.name.startswith(“li”), User.email.startswith(“li”))).all()
查詢名字不等於wang的所有使用者[2種方式]
User.query.filter(not_(User.name==“wang”)).all()
User.query.filter(User.name!=“wang”).all()
查詢id為[1, 3, 5, 7, 9]的使用者
User.query.filter(User.id.in_([1, 3, 5, 7, 9])).all()
所有使用者先按年齡從小到大, 再按id從大到小排序, 取前5個
User.query.order_by(User.age, User.id.desc()).limit(5)
分頁查詢, 每頁3個, 查詢第2頁的資料
pn = User.query.paginate(2, 3)
pn.items pn.page pn.pages
多表關係
一對多
class User(db.Model): # 一個使用者對應多個收貨地址 一的一方
tablename = “users”
# 定義類屬性 記錄欄位
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
addresses = db.relationship(“Address”, backref=“user”)
class Address(db.Model): # 多的一方
tablename = “addresses”
id = db.Column(db.Integer, primary_key=True)
detail = db.Column(db.String(64))
user_id = db.Column(db.Integer, db.ForeignKey(“users.id”)) # 在多的一方設定外來鍵
資料顯示&表單新增
資料顯示
定義路由函式,並將 Author 資料傳到模板
@app.route(’/’, methods=[‘GET’, ‘POST’])
def index():
# 如果是GET請求
if request.method == ‘GET’:
authors = Author.query.all() # type: list[Author]
return render_template(“book_test.html”, authors=authors)
模版關鍵程式碼
-
{% for author in authors %}
- {{ author.name }}
- {{ book.name }} {% endfor %}
-
{% for book in author.books %}
定義表單類
實際操作順序: 1.python 檔案 db init 2.python 檔案 db migrate -m"版本名(註釋)" 3.python 檔案 db upgrade 然後觀察表結構 4.根據需求修改模型 5.python 檔案 db migrate -m"新版本名(註釋)" 6.python 檔案 db upgrade 然後觀察表結構 7.若返回版本,則利用 python 檔案 db history檢視版本號 8.python 檔案 db downgrade(upgrade) 版本號 藍圖 藍圖/Blueprint物件用起來和一個應用/Flask物件差不多,最大的區別在於一個 藍圖物件沒有辦法獨立執行,必須將它註冊到一個應用物件上才能生效 使用藍圖可以分為三個步驟 1,建立一個藍圖物件 admin=Blueprint('admin',__name__)
2,在這個藍圖物件上進行操作,註冊路由,指定靜態資料夾,註冊模版過濾器
@admin.route(’/’)
def admin_home():
return ‘admin_home’
3,在應用物件上註冊這個藍圖物件
app.register_blueprint(admin,url_prefix=’/admin’)
當這個應用啟動後,通過/admin/可以訪問到藍圖中定義的檢視函式
註冊靜態路由
和應用物件不同,藍圖物件建立時不會預設註冊靜態目錄的路由。需要我們在 建立時指定 static_folder 引數。
下面的示例將藍圖所在目錄下的static_admin目錄設定為靜態目錄
admin = Blueprint(“admin”,name,static_folder=‘static_admin’)
app.register_blueprint(admin,url_prefix=’/admin’)
現在就可以使用/admin/static_admin/ 訪問static_admin目錄下的靜態檔案了 定製靜態目錄URL規則 :可以在建立藍圖物件時使用 static_url_path 來改變靜態目錄的路由。下面的示例將為 static_admin 資料夾的路由設定為 /lib
admin = Blueprint(“admin”,name,static_folder=‘static_admin’,static_url_path=’/lib’)
app.register_blueprint(admin,url_prefix=’/admin’)
設定模版目錄
藍圖物件預設的模板目錄為系統的模版目錄,可以在建立藍圖物件時使用 template_folder 關鍵字引數設定模板目錄
admin = Blueprint(‘admin’,name,templat
NoSQL:一類新出現的資料庫(not only sql)
泛指非關係型的資料庫
nosq一般可以儲存多種資料型別, 除了基本型別(數字、字串、日期),還可以儲存json、html等檔案型別
資料以鍵值方式存取, 不能像關係型資料庫一樣使用外來鍵建立表之間的關係, 不適合用於關係特別複雜的資料查詢場景
每種nosql資料庫都有自己的api和語法, 不支援SQL語法
“事務”的支援:sql對事務的支援非常完善,而nosql基本不支援事務
NoSQL中的產品種類相當多, 各有自己擅長的業務場景:
Mongodb
Redis
Hbase hadoop
Cassandra hadoop
Redis 優勢
效能極高 – 記憶體型資料庫,讀寫速度極快
豐富的資料型別 – 支援儲存 Strings, Lists, Hashes, Sets 及 Ordered Sets 等多種資料型別。
原子性 – Redis的所有操作都是原子性的,並且支援事務 (不支援回滾)。
資料持久化 – 可以將記憶體資料儲存到磁碟中, 並提供多種儲存機制。
資料備份 – 支援主從模式 (master - slave) 的資料備份。
叢集 – 支援叢集, 並實現了哨兵機制。
豐富的特性 – 設定過期時間, 釋出/訂閱, 通知等機制。
Redis應用場景
session儲存 (效能更好, 方便設定過期時間)
購物車 (以請求令牌token作為key,記錄當前使用者購物車中的商品及其數量)
網頁快取 (將 請求的url/返回的網頁內容 作為redis的key/value進行快取)
實時排行 (利用zset的資料權重分析資料排行, 按排名展示資料
redis叢集
分類
軟體層面
硬體層面
軟體層面:只有一臺電腦,在這一臺電腦上啟動了多個redis服務。
硬體層面:存在多臺實體的電腦,每臺電腦上都啟動了一個redis或者多個redis服務。
搭建叢集
當前擁有兩臺主機172.16.179.130、172.16.179.131,這⾥的IP在使⽤時要改為實際值
參考閱讀
redis叢集搭建 http://www.cnblogs.com/wuxl360/p/5920330.html
[Python]搭建redis叢集 http://blog.5ibc.net/p/51020.html