flask6 session

app

from flask import Flask
from flask_script import Manager
from App.ext import db
from App.views import blue

app = Flask(__name__)
app.config.from_pyfile("settings.py")
db.init_app(app)
manager = Manager(app)
app.register_blueprint(blue)

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

App.ext

from flask_sqlalchemy import SQLAlchemy

#数据库对象
db = SQLAlchemy()

settings

DEBUG = True
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:19970223@localhost:3306/sess"
SQLALCHEMY_TRACK_MODIFICATIONS = False
# 签名加密,session使用
SECRET_KEY = "i9490kl*(780990HGjhsoid7872378287mn,,.,ghghY!@3"

App.views

from flask import Blueprint, render_template, request, session, redirect, url_for, flash
from App.models import User

blue = Blueprint("blue",__name__)
# 用户验证装饰器
def check_login(func):
    def inner(*args,**kwargs):
        # 验证逻辑
        if session.get("username"):
            return func(*args,**kwargs)
        else:
            return redirect("/login/")
    return inner

@blue.route("/")
def index():
    # 判断是否登录
    username = session.get('username')
    print(username)
    return render_template("index.html")

@blue.route("/login/",methods=['GET','POST'])
def login():
    if request.method == 'POST':
        print(request.values.to_dict())
        username = request.values.get('username')
        password = request.values.get('password')
        # 验证用户名和密码
        user = User.query.filter(User.username==username,User.password==password).first()
        if user:
            # 设置session
            session['username'] = "sdfdsfds"
            session['uid'] = "sdfkjsdfjk"
            session['hello'] = "3333"
            return redirect("/")
        else:
            # 消息闪烁
            flash("用户名或密码错误")
            return redirect(url_for("blue.login"))
    return render_template("login.html")

@blue.route("/logout/")
def logout():
    # 清除单个键值对
    # session.pop('username')
    session.clear()
    return redirect("/")

@blue.route("/reply/")
@check_login
def user_reply():
    return "回复"

App.models

from App.ext import db

class User(db.Model):
    __tablename__ = 'user'

    uid = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(30), nullable=False)
    password = db.Column(db.String(128), nullable=False)
    gender = db.Column(db.Integer)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{# session是全局对象,在模板和后端代码里都可以使用   #}
{% if session.get('username') %}
    <p>欢迎{{ session.get('username') }}回来, &nbsp; <a href="{{ url_for('blue.logout') }}">退出登录</a></p>
{% else %}
    <p>你还没有登录,请先 <a href="{{ url_for('blue.login') }}">登录</a> </p>
{% endif %}
</body>
</html>

login.html

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>Bootstrap 101 Template</title>

    <!-- Bootstrap -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">

    <!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
    <!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
    <!--[if lt IE 9]>
      <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
      <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
    <![endif]-->
  </head>
  <body>
{#   消息闪烁  #}
    {% for message in get_flashed_messages() %}
        <div class="alert alert-warning alert-dismissible" role="alert">
          <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
          <strong>Warning!</strong> {{ message }}
        </div>
    {% endfor %}
    <form action="{{ url_for('blue.login') }}" method="post">
    用户名:<input type="text" name="username"> <br>
    密码:<input type="password" name="password"> <br>
    <input type="submit">
    </form>

    <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
    <script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
    <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
  </body>
</html>

login.html(简)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
  <body>
    <form action="{{ url_for('bp.login') }}" method="post">
        用户名:<input type="text" name="username"> <br>
        密码: <input type="password" name="password"> <br>
        <input type="submit">
    </form>
  </body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值