闲着无聊,学习Python+Flask做一个博客,这篇仅仅是记录一些我自己感觉重要的地方,以及介绍模块的大概功能,不适合啥基础都没有的新人看,想0基础学习,去百度flask,有中文文档,这篇博文的内容部分是我自己的理解,大部分都是来源于文档
中文文档,可用于快速入门:http://docs.jinkan.org/docs/flask/
在写这篇博文(会持续跟新)的时候,我自己写的已经算是把FLask目录结构给“抄”下来了,脑子里一团乱,全是各种库,从原先只在一个文件里写代码并运行,然后把各种功能给模块化(类),所以在此理清一下过程。
在目录中,templates是存放模板(可以说是html)文件,static是存放静态文件,例如js、css、图片等文件,模板加载静态文件就必须从static文件夹里加载,因为flask默认使用的是jinja2模板。
其中models.py是存放数据库表的模型,我们是通过这个模型,把数据抽象化,然后填写模型中的属性,写入数据库,也通过模型,从数据库读取数据,模型可以看作表,抽象的表。
config.py是设置一些Flask对象的设置,如app.config['SECRET_KEY']
,设置后会对存储在客户端的cookie进行加密,篡改cookie后会失效,会话也会失效;app.config['SQLALCHEMY_DATABASE_URI']
数据库地址…..
良好的工程目录,能够清楚的让自己知道什么目录是干什么的,比如user文件夹就是用来普通用户的数据,与普通用户相关的视图,注册登陆等等的表单格式,以及_init_.py,使用蓝本去模块化的管理每个功能,而不是所有的功能都是由Flask唯一的实例app来指定路由,这样会暴露app实例,用蓝本,可以模块化功能,还可以选择是否加载蓝本来管理功能。
Jinja2模板,我们可以理解为将写在HTML的一些Jinja2语法转义为HTML语言,从而可以从模板HTML中获取我们想要修改的信息,以及简化编辑HTML。Jinja2 使用一个名为 Environment 的中心对象。这个类的实例用于存储配 置、全局对象,并用于从文件系统或其它位置加载模板。即使你通过:class:Template 类的构造函数用字符串创建模板,也会为你自动创建一个环境,尽管是共享的。
大多数应用在应用初始化时创建一个 Environment 对象,并用它加载模板。 在某些情况下,如果使用多份配置,使用并列的多个环境无论如何是有用的。当然这里只是简单的介绍一下Jinja2,在flask(集成jinja2并初始化)中为什么我们要把HTML文件放进templates文件夹,静态文件放入static文件夹。
例如我们flask项目里集成Jinja2初始化代码(不用我们自己写):
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('App', 'templates'))
目录里的__init__.py
文件,在刚上手python的时候不知道是什么,如果在文件夹中添加__init__.py
文件,python在解析的时候,会把该文件夹当作一个包,可以import
该包访问,在导入后会被执行,我们可以在__init__.py
修改__main__
初始化为一个列表[‘模块名’,’模块名’,’模块名’],等等,当然我们也可以不用修改,只是提供这个包来给我们访问文件夹下的模块。
最后再来说说为什么这样划分目录,我也不知道怎么说,毕竟我也是初学者,我是这样理解的Flask中的MVC:
controller目录:MVC中的C,主要存放视图函数
model目录:MVC中的M,主要存放实体类文件,映射数据库中表
templates:MVC中的V,存放html文件
这样设置目录结构后,我们方便于设置路由。
虽然 run() 方法适用于启动本地的开发服务器,但是你每次修改代码后都要手动重启它。这样并不够优雅,而且 Flask 可以做到更好。如果你启用了调试支持,服务器会在代码修改后自动重新载入,并在发生错误时提供一个相当有用的调试器。
有两种途径来启用调试模式。一种是直接在应用对象上设置
app.debug = True
app.run()
另一种是作为 run 方法的一个参数传入:
app.run(debug=True)
按照教程慢慢的做,发现去实现的话,感觉要把相应的功能想好,然后去设计数据库,网页的布置我放在最后,我不会html、css,直接去下了个模板,登陆注册界面自己就随便站粘贴贴随便写写,下面来介绍,在写的过程中使用的包,以及大概作用。
flask_migrate:数据库迁移,因为每次要在代码里修改表的结构,想更新到数据库,就把数据库重新删了,然后重新根据模型建数据库,这样会丢失数据,所以这个包的作用到了。
from flask_login:提供了用户会话管理。它处理了日常的登入,登出并且长时间记住用户的会话。至少我目前用到的功能是,管理某些网页是需要登陆后访问,或者是不同权限的登陆,还有用户的登陆与登出,最初按教程一步一步做的时候,按想法来说,判断是否有用户登陆,就得写一个全局变量curr_user,用jinja的{%if %}之类判断,然后还要自己写东西,对于我这样一个python新手,想要求速度的话,就直接使用flask_login.
flask_SQLAlchemy:flask:数据库框架,可以设置使用mysql或者其他数据库,我是使用教程推荐的sqlite,反正都挺方便的,SQLAlchemy提供了ORM(对象关系映射),一种抽象的数据驱动,不用直接写一大堆sql语句,而是通过对模型的操作,对模型对应数据库中的表,进行操作,让我们处理增删改查更方便。
flask_wtf 与wtforms : flask扩展出的表单类,让我们处理数据更加轻松,我感觉是面向对象化吧,我们可以把注册、登陆,以及一些功能设计成一个表单类,当我们在网页中post 表单时,只要获取这个表单就可以获得数据了。当然这个要配合Jinja模板,对模板进行修改成jinja2语法。
flask_script: 使用shell
werkzeug: 对密码加密,我们一般都是把数据保存在数据库,如果我们数据库存放的密码都是明文存放,一旦数据库被盗取,就GG了,所以我们可以在用户注册的时候,把密码通过一系列加密,然后存放到数据库中,当我们验证用户的时候,我们就把加密后的数据还原,这样就安全了,为了方便,就可以使用这个包。
Blueprint: 蓝图,Flask 用 蓝图(blueprints) 的概念来在一个应用中或跨应用制作应用组件和支持通用的模式。蓝图很好地简化了大型应用工作的方式,并提供给 Flask 扩展在应用上注册操作的核心方法。一个 Blueprint 对象与 Flask 应用对象的工作方式很像,但它确实不是一个应用,而是一个描述如何构建或扩展应用的 蓝图 。
为什么使用蓝图?
Flask 中的蓝图为这些情况设计:
把一个应用分解为一个蓝图的集合。这对大型应用是理想的。一个项目可以实例化一个应用对象,初始化几个扩展,并注册一集合的蓝图。
以 URL 前缀和/或子域名,在应用上注册一个蓝图。 URL 前缀/子域名中的参数即成为这个蓝图下的所有视图函数的共同的视图参数(默认情况下)。
在一个应用中用不同的 URL 规则多次注册一个蓝图。
通过蓝图提供模板过滤器、静态文件、模板和其它功能。一个蓝图不一定要实现应用或者视图函数。
初始化一个 Flask 扩展时,在这些情况中注册一个蓝图。
Flask 中的蓝图不是即插应用,因为它实际上并不是一个应用——它是可以注册,甚至可以多次注册到应用上的操作集合。为什么不使用多个应用对象?你可以做到那样 (见 应用调度 ),但是你的应用的配置是分开的,并在 WSGI 层管理。
蓝图作为 Flask 层提供分割的替代,共享应用配置,并且在必要情况下可以更改所注册的应用对象。它的缺点是你不能在应用创建后撤销注册一个蓝图而不销毁整个应用对象。
(由于人懒,最近耳鸣,所以博客要缩水了,打算把里面存放的博文是CSDN的链接。。弄成一个列表的样式,然后再加一个评论功能,然后就去弄Js游戏,继续把那个小小小游戏框架弄到可以做一个一般的游戏,或者选一个较好的html游戏引擎来做orz)