Flask框架(三)--獲取圖片,flask-script(runserver,migrate),會話,請求,考勤功能

一、獲取圖片

保存圖片

在這裏插入圖片描述

使用圖片

在這裏插入圖片描述
在這裏插入圖片描述

二、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 %}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章