一、獲取圖片
保存圖片
使用圖片
二、Flask插件
flask-script是第三方提供的Flask項目交互式插件,可以使用flask-script管理安裝項目命令。
安裝flask-script
pip install flask-script
使用flask-script插件編寫運行項目,實現項目運行和表結構同步
配置pycharm啓動
第一種
只能使用runserver,不能使用debug
第二種
配置Flask server,可runserver,也可debug
三、會話
(一)COOKIE
設置COOKIE
獲取COOKIE
登錄裝飾器
def loginVaild(func):
@functools.wraps(func) # 保留原函數名
def inner(*args,**kwargs):
user_id = request.cookies.get('user_id')
email = request.cookies.get('email')
if user_id and email:
user = User.query.filter_by(email=email,id=user_id).first()
if user:
return func(*args,**kwargs)
else:
return redirect('/login/')
else:
return redirect('/login/')
return inner
使用
這其中涉及到了登錄裝飾器和路由裝飾器,兩個裝飾器的使用。應將登錄裝飾器放在下面。
還涉及到了,裝飾器修飾完函數後,函數名就變爲inner了的問題,這樣會造成視圖重名,出現錯誤。需要加@functools.wraps(func),保留原函數名。
刪除COOKIE
登出
@app.route('/logout/',methods=['get','post'])
def logout():
response = redirect('/login/')
response.delete_cookie('email')
response.delete_cookie('user_id')
return response
裝飾器
函數名改變問題
def loginouter(func):
print('我是登錄裝飾器')
def inner(*args,**kwargs):
print('驗證')
func()
return inner
@loginouter
def index():
print('index')
print(index.__name__)
結果:
我是登錄裝飾器
inner
import functools
def loginouter(func):
print('我是登錄裝飾器')
@functools.wraps(func)
def inner(*args,**kwargs):
print('驗證')
func()
return inner
@loginouter
def index():
print('index')
print(index.__name__)
結果:
我是登錄裝飾器
index
多層裝飾器
import functools
def flask_url(func):
print('我是flask url裝飾器')
def inner(*args,**kwargs):
print('url')
func(*args,**kwargs)
return inner
def loginouter(func):
print('我是登錄裝飾器')
def inner(*args,**kwargs):
print('驗證')
func()
return inner
@flask_url # 2.index = falsk_url(index)
@loginouter # 1.index = loginouter(index)
def index():
print('index')
index()
結果:
我是登錄裝飾器
我是flask url裝飾器
url
驗證
index
def f_outer(func):
def inner(*args,**kwargs):
return 'i ' + func(*args,**kwargs)
return inner
def s_outer(func):
def inner(*args,**kwargs):
return 'am ' + func(*args,**kwargs)
return inner
@f_outer
@s_outer
def test():
return 'gutianle'
print(test())
結果:
i am gutianle
(二)SESSION
flask使用session,session默認存在內存當中,需要使用插件才能存儲到數據庫中。
django的settings中有secretkey,flask中沒有,需要配置。
配置
方法一
方法二
設置SESSION
獲取SESSION
刪除SESSION
方法一
方法二
總結
- cookie
- 優點:成本低,能夠解決瀏覽器持續訪問的問題,校驗速度快
- 缺點:cookie下發到用戶,放在用戶本地,安全性低
- session
- 優點:解決了cookie安全性的問題
- 缺點:需要放在服務器上面,django通常放在數據庫中,flask放在內存中,成本高
四、flask請求
通常web服務請求:
- form表單
- get,post請求
- ajax
- 爬蟲
django中:
- request請求對象,視圖中的形參
- request.POST
- request.GET
- request.COOKIES
- request.META
- request.body
flask中:需要from flask import request導入
- request.form 獲取post請求的參數,從表單請求中獲取
- request.args 從url中獲取
- request.cookies
- request.files
- request.method
- request.url 請求的路由
- request.headers 請求頭
五、完成考勤功能
- 考勤記錄
- 考勤申請
- 考勤審覈
建模–請假條
- 請假人的用戶名
- 姓名
- 請假類型
- 請假開始時間
- 請假截止時間
- 請假描述
- 聯繫方式
- 狀態
- 審覈中
- 通過
- 駁回
- 銷假
class Leave(BascModel):
__tablename__='leave'
'''
審覈中 0
通過 1
駁回 2
銷假 3
'''
request_id = db.Column(db.Integer) # 請假人id
request_name = db.Column(db.String(32)) # 請假人姓名
request_type = db.Column(db.String(32)) # 請假類型
request_start = db.Column(db.DATETIME) # 請假開始時間
request_end = db.Column(db.DATETIME) # 請假結束時間
request_description = db.Column(db.TEXT) # 請假描述
request_phone = db.Column(db.String(11)) # 聯繫方式
request_status = db.Column(db.Integer) # 請假狀態
視圖
@app.route('/leave_list/',methods=['get','post'])
@loginVaild
def leave_list():
user = User.query.get(request.cookies.get('user_id'))
if request.method == 'POST':
flag = 1
data = request.form
for one in data.keys():
if not data[one]:
flag = 0
if flag:
leave = LeaveList()
leave.request_id = request.cookies.get('user_id')
leave.request_name = user.name
leave.request_type = data.get('type')
leave.request_start = data.get('start')
leave.request_end = data.get('end')
leave.request_description = data.get('dec')
leave.request_phone = data.get('phone')
leave.request_status = 0
leave.save()
return redirect('/leave_all_list/')
else:
error = '表中項目均不可爲空'
return render_template('leave_list.html',**locals())
@app.route('/leave_all_list/',methods=['get','post'])
@loginVaild
def leave_all_list():
user = User.query.get(request.cookies.get('user_id'))
leave = LeaveList.query.all()
return render_template('leave_all_list.html',**locals())
模板
leave_list.html
{% extends 'base.html' %}
{% block title %}
請假條
{% endblock %}
{% block style %}
<style>
th {
text-align: center;
}
</style>
{% endblock %}
{% block content %}
<form action="" method="post">
<table class="table table-bordered">
<tr>
<th colspan="4" style="text-align: center">
<h1>請假條</h1>
</th>
</tr>
<tr>
<th>請假人姓名</th>
<td><input type="text" name="username" value="{{ user.name }}" disabled class="form-control form-control-user"></td>
<th>請假類型</th>
<td>
<select name="type" class="form-control form-control-user">
<option value="事假" selected>事假</option>
<option value="病假">病假</option>
<option value="婚假">婚假</option>
<option value="產假">產假</option>
<option value="缺勤">缺勤</option>
<option value="加班">加班</option>
<option value="出差">出差</option>
<option value="調休">調休</option>
<option value="其他">其他</option>
</select>
</td>
</tr>
<tr>
<th>開始時間</th>
<td><input type="date" name="start" class="form-control form-control-user"></td>
<th>結束時間</th>
<td><input type="date" name="end" class="form-control form-control-user"></td>
</tr>
<tr>
<th>聯繫方式</th>
<td><input type="text" name="phone" placeholder="請預留電話號碼" class="form-control form-control-user"></td>
<th>請假天數</th>
<td><input type="number" name="days" class="form-control form-control-user"></td>
</tr>
<tr>
<th>請假描述</th>
<td colspan="3"><textarea name="dec" cols="85" class="form-control form-control-user"></textarea></td>
</tr>
<tr>
<td colspan="4" style="text-align: center">
<input type="submit" value="提交" class="btn btn-primary">
</td>
</tr>
</table>
</form>
<p style="color: red">{{ error }}</p>
{% endblock %}
leave_all_list.html
{% extends 'base.html' %}
{% block label %}
請假記錄
{% if user.name %}
<a class="btn btn-warning" href="/leave_list/" style="float: right;margin-right: 5%;">請假</a>
{% else %}
<button class="btn btn-warning" disabled style="float: right;margin-right: 5%;">請假</button>
<p style="color: red;font-size: 16px">請先完善用戶姓名,再使用請假功能</p>
{% endif %}
{% endblock %}
{% block title %}
請假記錄
{% endblock %}
{% block content %}
<table class="table table-bordered">
<tr>
<th>假條編號</th>
<th>請假人</th>
<th>開始時間</th>
<th>結束時間</th>
<th>狀態</th>
<th>操作</th>
</tr>
{% for one in leave %}
<tr>
<td>{{ one.id }}</td>
<td>{{ one.request_name }}</td>
<td>{{ one.request_start }}</td>
<td>{{ one.request_end }}</td>
{% if one.request_status == 0 %}
<td>審覈中</td>
{% elif one.request_status == 1 %}
<td>通過</td>
{% elif one.request_status == 2 %}
<td>駁回</td>
{% elif one.request_status == 3 %}
<td>銷假</td>
{% endif %}
<td>
<button class="btn btn-primary">審覈</button>
</td>
</tr>
{% endfor %}
</table>
{% endblock %}