Flask 学习 (一)

详见flask学习包:

sydy_flask

后端代码:

from flask import Flask
from flask import render_template
from flask import request
from flask import redirect
from flask import session
from flask import url_for

app = Flask(__name__)

# Session, Cookies以及一些第三方扩展都会用到SECRET_KEY值
app.config['SECRET_KEY'] = '123456'
app.Debug = True

data = [
    {
        'name':'a1',
        'old':22,
        'gender':'',
    },
    {
        'name':'a2',
        'old':12,
        'gender':''
    },
    {
        'name': 'a3',
        'old': 22,
        'gender': ''
    },
]

@app.route('/',methods=['GET','POST'],endpoint='l1')
def login():
    if request.method == "GET":
        return render_template('login.html')
    elif request.method == "POST":
        # request.query_string 为存储头部数据
        # request.form 中存储的是body数据
        user = request.form.get('user')
        pwd = request.form.get('pwd')
        if user == 'root' and pwd == '123':
            session['user'] = user
            return redirect('/index')
        else:
            return render_template('login.html',error='用户名或密码错误!')

@app.route('/index/',methods=['GET'],endpoint='zhuye')
def index():
    url = url_for('l1')
    if request.method == 'GET':
        user = session.get('user')
        if not user:
            return redirect(url)
        return render_template('index.html',u_list=data)

@app.route("/detail/<int:id>",methods=['GET'])
def detail(id):
    return str(id)

if __name__ == '__main__':
    app.run()

前段代码:

index

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <table>
        {% for i in u_list %}
            <tr>
                <td>{{ i }}</td>
                <td>{{ i.old }}</td>
                <td>{{ i.get('gender') }}</td>
                <td>{{ i.get('gender') }}</td>
                <td><a href="/detail/{{ i.get('old') }}">查看详细</a></td>
            </tr>
        {% endfor %}
    </table>

</body>
</html>

login

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
        <h1>
            登录
        </h1>
        <form method="post">
            <span>用户名 <input name="user" type="text"></span>
            <span>密码 <input name="pwd" type="pwd"></span>
            <input type="submit" value="提交">{{ error }}
        </form>
        <script src="/static/js/jquery-1.7.1.min.js"></script>
        <script>
                alter('OK')
        </script>
</body>
</html>

目录截图:

from flask import Flask
from flask import render_template
from flask import request
from flask import redirect
from flask import session
from flask import url_for
from functools import wraps

app = Flask(__name__)

#-------------------------------------------------------------------------------
# flask 实现登录装饰器的功能
def login_required(func):
    @wraps(func)
    # @wraps(view_func)的作用:     不改变使用装饰器原有函数的结构(如__name__, __doc__)
    # 不使用wraps可能出现的ERROR:   view_func...endpoint...map...
    def wrapper(*args,**kwargs):
        if session.get('user'):
            return func(*args,**kwargs)
        else:
            return redirect('/')
    return wrapper

#-------------------------------------------------------------------------------

# flask 配置文件介绍:
# 方式一:
# Session, Cookies以及一些第三方扩展都会用到SECRET_KEY值
# app.config['SECRET_KEY'] = '123456'
# app.config['DEBUG'] = True

# 方式二:(只有部分可以如此操作)
# app.secret_key = '123456'

# 方式三:(导入配置文件的方式)
# app.config.from_pyfile('setting.py')

# 方式四:(推荐方式:在配置文件中写一个类,将配置写在类里面,再导入)
app.config.from_object('setting.Text')

# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
# 使用session 前 必须配置SECRET_KEY!!!
# session 操作:(session就相当于是一个字典!)
# session['类型'] = 值
# session.pop['类型']
# del session['类型']

# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

# 路由系统:
# 基于装饰器来实现,但是究其本质是通过下面函数实现的
# app.add_url_rule(rule='/路径',endpoint='别名',view_func='视图函数',methods='访问的类型/["GET","POST"]')

# CBV 的flask 方式:
# from flask import views
# 配置视图
# class Text(views.MethodView):
#     methods = ['GET','POST']
#     # 登录装饰器
#     # decorators = [login_required,]
#
#     def get(self):
#         return 'Text_Class_get'
#
#     def post(self):
#         return 'Text_Class,post'
#
# 配置路由
# app.add_url_rule(rule='/text/',view_func=Text.as_view(name='text'))

# app.add_url_rule 和 app.route
# 参数:
# rule: url 规则
# view_func 视图函数名称
# defaults=None 默认值,当url中没有参数
# endpoint=None 反向生成url,不能重名,在使用装饰器时,没有导入@wraps(func)则需要区分
# methods=None 允许的请求方式,如:['GET','POST']
# strict_slashes=None 对URL最后的 / 符号是否严格要求
# redirect_to=None 重定向地址
# subdomain=None 子域名访问,需要配合域名使用

# 常用路由方式:
# @app.route('/user/<username>')
# @app.route('/user/<int:post_id>')
# @app.route('/user/<float:post_id>')
# @app.route('/user/<path:PATH>')
# @app.route('/user/',methods=['GET','POST'])

# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

# 模板:(模板也支持导入,继承)
# 跟 django 都是使用的jinja2 模板
# 前段 安全渲染 {func | safe }
# 后端 安全渲染  import Markup 函数

# # 新增功能
# {% macro 自定义函数名(参数,参数N) %}
#     <span>{{参数}}---{{参数n}}</span>
#     <span>{{参数}}---{{参数n}}</span>
#     <span>{{参数}}---{{参数n}}</span>
# {% endmacro%}
#
# # 调用上面的函数
# {{自定义函数(参数)}}

# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
# 请求和响应

# request
# response

# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

# 闪现 : 临时数据操作 如:显示错误信息
from flask import flash,get_flashed_messages

@app.route('/get')
def get():
    data = get_flashed_messages()
    # data = get_flashed_messages(category_filter=['l1']) 分类取数据
    print(data)
    return "get"

@app.route('/set')
def set():
    flash('aaaaaa')
    # flash('aaaaaa',category='l1') #可以数据分类
    return "set"

# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

# 请求扩展 (django中的中间件)
# @app.before_first_request
# 函数

@app.before_request
def preocess_request(*args,**kwargs):
    print(request.path)

@app.after_request
def preocess_response(response):
    return response

# @app.after_request
# 函数




# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
# 传递数据至前段
data = [
    {
        'name':'a1',
        'old':22,
        'gender':'',
    },
    {
        'name':'a2',
        'old':12,
        'gender':''
    },
    {
        'name': 'a3',
        'old': 22,
        'gender': ''
    },
]

@app.route('/',methods=['GET','POST'],endpoint='l1')
def login():
    if request.method == "GET":
        return render_template('login.html')
    elif request.method == "POST":
        # request.query_string 为存储头部数据
        # request.form 中存储的是body数据
        user = request.form.get('user')
        pwd = request.form.get('pwd')
        if user == 'root' and pwd == '123':
            session['user'] = user
            return redirect('/index')
        else:
            return render_template('login.html',error='用户名或密码错误!')

#  不是装饰器 实现的方式:
# @app.route('/index/',methods=['GET'],endpoint='zhuye')
# def index():
#     url = url_for('l1')
#     if request.method == 'GET':
#         user = session.get('user')
#         if not user:
#             return redirect(url)
#         return render_template('index.html',u_list=data)

# 装饰器实现的方式:
@app.route('/index/',methods=['GET'])
@login_required                                         # flask 登录装饰器
def index():
    return render_template('index.html',u_list=data)

@app.route("/detail/<int:id>",methods=['GET'])
def detail(id):
    return str(id)



if __name__ == '__main__':
    app.run()

猜你喜欢

转载自www.cnblogs.com/Anec/p/10408158.html
今日推荐