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 %}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flask-Paginate是一个Flask扩展,它提供了一种简单的方法来实现分页功能。它基于SQLAlchemy,并且可以与任何SQLAlchemy支持的数据库一起使用。 首先,你需要安装Flask-Paginate扩展。可以通过以下命令来安装: ``` pip install Flask-Paginate ``` 然后,你需要导入Flask-Paginate扩展并创建一个分页器。以下是一个简单的示例: ```python from flask_paginate import Pagination, get_page_args @app.route('/') def index(): # 获取当前页码和每页显示的数量 page, per_page, offset = get_page_args(page_parameter='page', per_page_parameter='per_page') # 从数据库中获取数据 data = get_data_from_database(offset=offset, per_page=per_page) # 创建分页器 pagination = Pagination(page=page, per_page=per_page, total=count_total_items_in_database(), css_framework='bootstrap4') # 渲染模板 return render_template('index.html', data=data, pagination=pagination) ``` 在上面的示例中,我们首先使用`get_page_args`函数从请求参数中获取当前页码和每页显示的数量。然后,我们从数据库中获取数据,并使用`Pagination`类创建一个分页器对象。最后,我们将数据和分页器对象传递给模板进行渲染。 在模板中,你可以使用`prev_href`,`next_href`和`links`属性来生成分页器的HTML代码。以下是一个简单的示例: ```html <div class="pagination"> <a href="{{ pagination.prev_href() }}">Previous</a> {% for page in pagination.links %} {% if page == '...' %} <span class="ellipsis">...</span> {% elif page == pagination.page %} <span class="current">{{ page }}</span> {% else %} <a href="{{ page }}">{{ page }}</a> {% endif %} {% endfor %} <a href="{{ pagination.next_href() }}">Next</a> </div> ``` 上面的代码会生成一个类似于以下HTML代码的分页器: ```html <div class="pagination"> <a href="/?page=1&per_page=10">Previous</a> <a href="/?page=1&per_page=10">1</a> <a href="/?page=2&per_page=10">2</a> <a href="/?page=3&per_page=10">3</a> <a href="/?page=4&per_page=10">4</a> <a href="/?page=5&per_page=10">5</a> <span class="ellipsis">...</span> <a href="/?page=10&per_page=10">10</a> <a href="/?page=2&per_page=10">Next</a> </div> ``` 此外,你还可以使用`prev_disabled`和`next_disabled`属性来禁用“上一页”和“下一页”链接,如果当前页码是第一页或最后一页的话。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值