37创客科创中心

 找回密码
 立即注册
查看: 1419|回复: 2

文田503:flask-login用户授权案例

  [复制链接]

194

主题

324

帖子

2399

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2399
发表于 2024-4-30 16:01:09 | 显示全部楼层 |阅读模式
#Flask Web开发 (qq.com)




本案例为python用户授权案例,使用了flask-login和sqlite数据库实现

python app文件
  1. # 安装 pip install Flask Flask-Login Flask-SQLAlchemy
  2. # flasklogin.py
  3. # sqlite 数据库;数据模型;bootstrap
  4. from flask import Flask, render_template, redirect, url_for, request, flash
  5. from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
  6. from flask_sqlalchemy import SQLAlchemy

  7. app = Flask(__name__)
  8. app.config['SECRET_KEY'] = '20200808'
  9. app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///login.db'

  10. db = SQLAlchemy(app)

  11. login_manager = LoginManager()
  12. login_manager.init_app(app)
  13. login_manager.login_view = 'login'


  14. ### 创建 User 模型
  15. class User(UserMixin, db.Model):
  16.     id = db.Column(db.Integer, primary_key=True)
  17.     username = db.Column(db.String(80), unique=True, nullable=False)
  18.     password = db.Column(db.String(120), nullable=False)


  19. ### 创建数据库
  20. db.create_all()


  21. ### 用户加载函数
  22. @login_manager.user_loader
  23. def load_user(user_id):
  24.     return User.query.get(int(user_id))


  25. ### 登录视图
  26. @app.route('/', methods=['GET', 'POST'])
  27. @app.route('/login', methods=['GET', 'POST'])
  28. def login():
  29.     if request.method == 'POST':
  30.         username = request.form['username']
  31.         password = request.form['password']
  32.         user = User.query.filter_by(username=username, password=password).first()

  33.         if user:
  34.             login_user(user)
  35.             flash('登录成功!')
  36.             return redirect(url_for('fs'))
  37.         else:
  38.             flash('用户不存在Invalid credentials')

  39.     return render_template('login.html')


  40. ### 受保护的视图
  41. @app.route('/user')
  42. @login_required
  43. def user():
  44.     return f'欢迎: {current_user.username}'

  45. @app.route('/index')
  46. # @login_required
  47. def index():
  48.     return f'index 欢迎:'

  49. @app.route('/fs')
  50. @login_required
  51. def fs():
  52.     return f'安全锋速 欢迎:'
  53. ### 退出
  54. @app.route('/logout')
  55. @login_required
  56. def logout():
  57.     logout_user()
  58.     return redirect(url_for('login'))


  59. if __name__ == '__main__':
  60.     app.run(debug=True)
复制代码

模板文件:templates/login.htlml
  1. <!--templates/login.html-->
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5.     <title>登录</title>
  6. </head>
  7. <body>

  8.     <h2>登录</h2>
  9.     <form method="post">
  10.         <input type="text" name="username" placeholder="用户名"><br>
  11.         <input type="password" name="password" placeholder="密码"><br>
  12.         <input type="submit" value="登录">
  13.     </form>

  14. </body>
  15. </html>
复制代码












本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

194

主题

324

帖子

2399

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2399
 楼主| 发表于 2024-5-12 11:01:40 | 显示全部楼层
0512增加部分内容
登录模板文件ulgoin.html
  1. {% extends 'base.html' %}
  2. {% from 'bootstrap5/form.html' import render_form, render_field, render_form_row %}

  3. {% block title %} edit note {% endblock title %}

  4. {% block content %}
  5. <h2>{{title}}</h2>
  6. <form method='post'>
  7.     {{ render_form(form) }}
  8. </form>
  9. {% endblock content %}
复制代码
基础模板base.html
  1. <!--引用bootstrap资源-->
  2. {% from 'bootstrap5/nav.html' import render_nav_item %}
  3. {% from 'bootstrap5/utils.html' import render_messages %}
  4. <!DOCTYPE html>
  5. <html lang="en">
  6. <head>
  7.     <meta charset="utf-8">
  8.     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  9.     <title>{{ title }}</title>
  10.     <link rel="icon" href="{{ url_for('static', filename='favicon.ico') }}">
  11. <!--    引用样式文件-->
  12.     {{ bootstrap.load_css() }}
  13.     <style>
  14.         pre {
  15.             background: #ddd;
  16.             padding: 10px;
  17.         }
  18.         h2 {
  19.             margin-top: 20px;
  20.         }
  21.         footer {
  22.             margin: 20px;
  23.         }

  24.     </style>
  25. </head>
  26. <body>


  27. <main class="container">
  28.     {{ render_messages(container=False, dismissible=True) }}
  29.     {% block content %}{% endblock %}
  30. </main>
  31. <!--底部-->
  32. <footer class="text-center">
  33.     {% block footer %}
  34.     <small> © 2018– 2025
  35.         <script>document.write(new Datetime().getFullYear())</script>
  36.         <a href="https://www.37ck.cn">37创客</a>
  37.     </small>
  38.     {% endblock %}
  39. </footer>
  40. <!--引入js效果脚本-->
  41. {{ bootstrap.load_js() }}
  42. </body>
  43. </html>
复制代码








回复

使用道具 举报

194

主题

324

帖子

2399

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2399
 楼主| 发表于 2024-5-1 16:44:17 | 显示全部楼层
  1. # 安装 pip install Flask Flask-Login Flask-SQLAlchemy
  2. from flask import Flask, render_template, redirect, url_for, request, flash
  3. from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
  4. from flask_sqlalchemy import SQLAlchemy

  5. app = Flask(__name__)
  6. app.config['SECRET_KEY'] = 'your_secret_key'
  7. app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///login.db'

  8. db = SQLAlchemy(app)

  9. login_manager = LoginManager()
  10. login_manager.init_app(app)
  11. login_manager.login_view = 'login'


  12. ### 创建 User 模型
  13. class User(UserMixin, db.Model):
  14.     id = db.Column(db.Integer, primary_key=True)
  15.     username = db.Column(db.String(80), unique=True, nullable=False)
  16.     password = db.Column(db.String(120), nullable=False)


  17. ### 创建数据库
  18. # db.create_all()


  19. ### 用户加载函数
  20. @login_manager.user_loader
  21. def load_user(user_id):
  22.     return User.query.get(int(user_id))


  23. ### 登录视图
  24. @app.route('/login', methods=['GET', 'POST'])
  25. def login():
  26.     if request.method == 'POST':
  27.         username = request.form['username']
  28.         password = request.form['password']
  29.         user = User.query.filter_by(username=username, password=password).first()

  30.         if user:
  31.             login_user(user)
  32.             return redirect(url_for('protected'))
  33.         else:
  34.             flash('用户不存在Invalid credentials')

  35.     return render_template('login.html')


  36. ### 受保护的视图
  37. @app.route('/protected')
  38. @login_required
  39. def protected():
  40.     return f'欢迎: {current_user.username}'


  41. ### 登出视图
  42. @app.route('/logout')
  43. @login_required
  44. def logout():
  45.     logout_user()
  46.     return redirect(url_for('login'))


  47. if __name__ == '__main__':
  48.     app.run(debug=True)
复制代码


login.html
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>Login</title>
  5. </head>
  6. <body>

  7.     <h2>Login</h2>
  8.     <form method="post">
  9.         <input type="text" name="username" placeholder="Username"><br>
  10.         <input type="password" name="password" placeholder="Password"><br>
  11.         <input type="submit" value="Login">
  12.     </form>

  13. </body>
  14. </html>
复制代码






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|37创客科创中心

GMT+8, 2025-12-10 05:14 , Processed in 0.160097 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表