使用 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上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能.下面的文章告诉大家这个功能可能并没有你所想像的那么简单,这是一个关 ...
随机推荐
- 201621123023《Java程序设计》第13周学习总结
一.本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 二.为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网络同 ...
- 如何让Syncthing始终使用同一个设备ID?
设备ID(device id)是Syncthing最重要的参数之一,所有节点的发现.连接等操作,全部是基于这个设备ID!对于已经建立起来的P2P网络,保持重要节点的设备ID唯一性是非常重要的!!!!那 ...
- 【12c OCP】最新CUUG OCP-071考试题库(50题)
50.(11-15)choose two Examine the structure of the MARKS table: Which two statements would execute su ...
- 自定义JSON返回字段
今天看到一篇文章,里面介绍了如何自定义返回json字段,感觉挺好用的,这里学习一下. 实现工具类: /** * @author fengzp * @date 17/2/20上午10:34 * @ema ...
- 菜鸟浅谈“诈骗”希望“治未病"
关于目前诈骗.社工数据的套路,说道说道~ 一.前言 这篇文章没有什么高深的技术,只有普普通通的套路,主要也是有I春秋各位表哥与诈骗分子的交手有感而发! 二.正文 因为我们上网的或者其他条件下的人群,没 ...
- css 实现关闭按钮 X
.close::before { content: "\2716";} 然后就显示出来了 这里有个更直接的例子 <!DOCTYPE html> <html lan ...
- 【UI组件】——用jQuery做一个上拉刷新
技术要点: 1.jQuery的插件写法 2.上拉刷新步骤分解 3.css样式 jQuery的插件写法: $.fn.pluginName = function() { return this.each( ...
- 使用Python Pandas处理亿级数据
在数据分析领域,最热门的莫过于Python和R语言,此前有一篇文章<别老扯什么Hadoop了,你的数据根本不够大>指出:只有在超过5TB数据量的规模下,Hadoop才是一个合理的技术选择. ...
- collections 模块常用方法学习
前情提要: 1:模块介绍 个人认为就是 python自带的骚操作模块.如果基础能力够给力的话,完全用不到 个人认为解析式才是装逼神奇,用模块的都是伪娘 2:deque 双向列表 from coll ...
- 机器学习笔记(五) K-近邻算法
K-近邻算法 (一)定义:如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别. (二)相似的样本,特征之间的值应该是相近的,使用k-近邻算法需要做标准化处理.否 ...