使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(三)——使用Flask-Login库实现登录功能
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(四)——对 run.py 的调整
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能
为了熟悉 Python 的 Web 开发,找到这个框架。在这里记录下使用它来写一个简单的登录 Demo 功能过程中碰到的问题。
上面几个链接就是使用到相关的库的文档。
Flask_Login 这个是官方实现的一套登录验证的库。
Flask_sqlalchemy 是官方对 sqlalchemy 库的一个封装,它是一个ORM,用于做数据库访问。
这里使用的开发工具是 PyCharm,使用这个工具可以直接创建一个 Flask 的项目。
一、从一个简单的示例说起
创建一个 run.py 的代码文件存放在项目的根目录下。

run.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
这是官方文档上的一个最简单能直接运行的应用了
这里要注意的有两个地方:
1.@app.route('/')
这里定义的是一个完整的路由,也就是说,现在这里定义的是“/”,则真实访问的地址就是首页。
2.app 对象
在该对象中进行的一切操作都是全局有效的。
示例:我要在所有的请求开始前,进行一些初始化操作,就可以这样直接使用 app 对象来定义
@app.before_request
def before_request():
pass
完整的代码是:
from flask import Flask app = Flask(__name__) @app.before_request
def before_request():
pass if __name__ == '__main__':
app.run()
二、创建应用
根据官方文档的说明,大型应用的目录结构是:
/yourapplication
/runserver.py
/yourapplication
/__init__.py
/views.py
/static
/style.css
/templates
layout.html
index.html
login.html
...
所以,要在项目的根目录下,创建一个应用的目录,这里则创建一个 demo 的应用,同时,将根目录下的 static 和 templates 文件夹删除。
在 demo 目录下,创建 3 个文件,分别是:“__init__.py”,“config.py”,“requirements.txt”。
__init__.py 这个就不多说了。
config.py 这个是 Flask 的配置信息。
requirements.txt 这个是用于方便 python 导入库使用的。
requirements.txt 文件里加上以下,这些都是要使用到的库。
Flask
Flask-SQLAlchemy
Flask-Login
Flask-WTF
pygments
PyMySQL

三、封装 SQLAlchemy 库
1.在 config.py 文件增加以下配置
DEBUG = True
SQLALCHEMY_ECHO = False
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@localhost/test?charset=utf8'
SECRET_KEY = '*\xff\x93\xc8w\x13\x0e@3\xd6\x82\x0f\x84\x18\xe7\xd9\\|\x04e\xb9(\xfd\xc3'
2.在 demo 目录下创建一个 common 目录,做为公共库,在该目录下创建 data.py 文件
使用 fetchall() 是取得 SQL 脚本的返回结果,rowcount 才是取得影响行数。
# config=utf-8
from sqlalchemy import create_engine
from sqlalchemy.sql import text
from demo.config import SQLALCHEMY_DATABASE_URI, SQLALCHEMY_ECHO def db_query(sql, settings=None, echo=None, args=None):
"""
执行增删改 SQL 语句
Args:
sql: SQL 语句
settings: 数据库连接字符串
echo: 是否输出 SQL 语句
args: SQL 参数 Returns:
执行结果
"""
if settings is None:
settings = SQLALCHEMY_DATABASE_URI if echo is None:
echo = SQLALCHEMY_ECHO return create_engine(settings, echo=echo).connect().execute(text(sql), args).fetchall() def db_execute(sql, settings=None, echo=None, args=None):
"""
执行增删改 SQL 语句
Args:
sql: SQL 语句
settings: 数据库连接字符串
echo: 是否输出 SQL 语句
args: SQL 参数 Returns:
影响行数
"""
if settings is None:
settings = SQLALCHEMY_DATABASE_URI if echo is None:
echo = SQLALCHEMY_ECHO return create_engine(settings, echo=echo).connect().execute(text(sql), args).rowcount # 测试代码
# SELECT * FROM py_user
# INSERT INTO py_user(name) VALUES('123456')
# data = db_query("SELECT * FROM py_user")
# print(data) # data = db_execute("INSERT INTO py_user(name) VALUES(:name)", args={'name': '123456'})
# print(data)

3. 在 common 目录下创建一个 __init__.py 文件
__init__.py:
# config=utf-8
from flask_sqlalchemy import SQLAlchemy __all__ = ['db']
db = SQLAlchemy()
这代码用于注册这个数据访问库。

四、初始化应用
对 app 要进行数据库注册,还有传入配置信息等,要注意的是,这里需要另开一个文件来做这些事,不可以全写在 run.py 文件里,因为以后会在使用其它库的时候,在这里进行注册,但在真实使用时就要调用这里生成的对象,这个时候两个文件相互 import 就会出现异常。
所以,这里将 run.py 中创建 app 对象的功能提取到 demo 目录下的 __init__.py 文件里。
/demo/__init__.py
# config=utf-8
from flask import Flask
from demo.common import db def create_app(config_filename=None):
app = Flask(__name__) if config_filename is not None:
# 注册数据访问信息
app.config.from_pyfile(config_filename) # 初始化数据库
configure_database(app) return app def configure_database(app):
"""初始化数据库连接。
Args:
app:应用对象。
Returns:
该函数没有返回值。
"""
db.init_app(app)

/run.py 文件里的代码则修改成
# config=utf-8
from flask import g
from flask_login import current_user
from demo import create_app app = create_app('config.py') @app.before_request
def before_request():
"""
这里是全局的方法,在请求开始之前调用。
其中 flask 有个全局的变量 g,它是和 session 一样的用途,可以使用它来保存当前用户的数据
Returns: """
g.user = current_user
pass if __name__ == '__main__':
app.run()

使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用的更多相关文章
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(四)——对 run.py 的调整
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(三)——使用Flask-Login库实现登录功能
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- Struts2整合Hibernate3实现用户登录功能
所用技术:struts2 ,hibernate,jsp,mysql 本DEMO仅仅实现用户登录功能,采用MVC思想,自己也觉得相对是比较简单,比较容易理解数据流向的一个例子,通过整合这个过程,能够清晰 ...
- JavaWeb学习记录(六)——用户登录功能
使用JDBC.spring框架.servlet实现一个简单的用户登录功能. 一.mySql数据库 SET FOREIGN_KEY_CHECKS=0; -- ---------------------- ...
- 实现Web上的用户登录功能
关于如何实现web上的自动登录功能 文章来源http://coolshell.cn/articles/5353.html Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能 ...
- 使用Struts1完成用户登录功能
1.Struts框架 框架(framework):就是一系列代码和开发模式的整合,使用框架后,所有开发人员都会按照框架提供的规范进行开发,使代码更容易维护和扩展. 使用框架的优点: 1) 易于维护 ...
- 你会做Web上的用户登录功能吗?
Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能.下面的文章告诉大家这个功能可能并没有你所想像的那么简单,这是一个关 ...
随机推荐
- WPF 使用OCX控件速度很慢
最近公司项目,需要在wpf上面嵌入ocx控件,但是程序运行起来后,进行操作后,界面一直很卡,找了各种原因,没有找到原因,后来直接运行exe文件,速度顿时快了很多.
- WP8.1StoreApp(WP8.1RT)---添加推送功能和获取系统信息
添加推送通知 1:Package.appxmanifest中的声明添加后台任务的推送通知权限 2:var channel = await PushNotificationChannelManager. ...
- Docker 网络模式和跨主机通信
Docker的四种网络模式 Bridge模式 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上.虚拟网桥的工作方式和物理交 ...
- PTA——删除重复字符
PTA 7-60 删除重复字符 #include<stdio.h> #include<string.h> #define N 85 int main() { ,flag; ch ...
- GO学习笔记 - 变量在定义时没有明确的初始化时会赋值为“零值 ”。
官方教程:https://tour.go-zh.org/basics/12 变量在定义时没有明确的初始化时会赋值为 零值 . 零值是: 数值类型为 0 , 布尔类型为 false , 字符串为 &qu ...
- mysql 批量更新的四种方法
批量更新的方法: 1 ) 逐条更新 代码如下: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 如果更新 ...
- 如何建立git 远程仓库
第1步:创建SSH Key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步.如果没有,打开Shell ...
- 【OCP-12c】CUUG 071题库考试原题及答案解析(13)
13.(6-7) choose twoWhich two statements are true regarding operators used with subqueries? (Choose t ...
- 【javascript】判断是否微信浏览器的最佳实践
根据判断UA中是否有关键字micromessenger,有的话则是微信内置浏览器 用Chrome的iPhone5模拟测试 //判断是否微信登陆 function isWeiXin() { var ua ...
- Linux C 重定向简单范例
//前言:我们知道printf()会将信息输出到stdout流,然后展示到屏幕上. //那么我们所实现的简单的重定向就可以将stdout指向一个文件,然后读写,这样就达到了重定向的目的. //code ...