Flask是一个python的Web后端框架,类似的还有Django、web.py、tornado等,我选择Flask作为开始学习后端的框架,网上也有很多关于不同框架之间的比较,Flask的特点在于小巧灵活、扩展性强等,当然没有最好的,只有最合适的,不同框架的异同在此不再赘述。
前期需掌握的知识:
1.对python有一个基本的掌握;可以看完一本python入门的书籍,网上已经有很多推荐的了,再刷一些编程的题目,例如codewars刷到3ku或者2ku。
2.对数据库知识有一定的了解;MySQL即可,会简单的增删查改等操作。
3.对前端html/css/js以及http等有一定的了解。html/css找个靠谱的教程过一遍即可,js也可以在codewars中练练,http可以通过写几个简单的python爬虫来初步了解。
如果你已经掌握了基本的这些知识,就和我一起来开发一个简单的问答网站吧,后续我们称之为Q&A Demo。开发环境是windows 7 64位 + python 3.6 + pycharm专业版 + mysql 5.6,也会用sublime text 3来临时跑一些测试的代码。浏览器使用chrome,对于我们调试html格式、布局等很有帮助。
python、pycharm、mysql的安装教程网上都有,并且我认为开始学习flask的同学在配置开发环境这个事情上都是完全OK的。需要说明的是我一开始使用mysql 5.7,在配置flask-sqlalchemy的时候报错,切换成5.6版本就好了。
我们打开PyCharm
,新建一个Project
,在左侧选择Flask
,右侧Location
可选择项目存放的位置,Project Interpreter
选择使用的编译器,我们当然可以选择已经安装在电脑上的Python 3.6
,但我建议选择使用Virtualenv
来建立一个虚拟的环境,这样在虚拟环境里安装包之类的,不会影响电脑上本身已经装的,并且后续如果项目较多的话也便于区分和管理。
点击Create
,创建好之后,PyCharm
自动在项目的文件夹下建立了static
、templates
文件夹和HarpQA.py
,此外还有一个venv
文件夹,是虚拟环境用的,我们可以暂时不用管它。(如果你的PyCharm
是社区版的,那么无法像专业版那样建立Flask
项目,对应的文件夹需要自己手动建立)。HarpQA.py
中的代码如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
首先从flask
导入Flask
,(我并没有pip install flask
,为何能导入呢?我理解是建立flask
项目的时候PyCharm
自动帮我们做了这个事情),然后初始化一个Flask
对象app
,参数是__name__
,__name__
代表的是本身这个模块的名字,我们暂时不用理解为何要传入这个参数。接下来是一个hello world
函数,并且有一个装饰器@app.route('/')
,意思是说,当接收到'/'
这个网址的请求时,执行hello world
这个函数,即返回字符串'Hello World!'
(add_url_rule()
也可以实现和@app.route
一样的功能 ,但使用装饰器应该更pythonic
吧),最后使用app.run()
运行。运行脚本后,提示Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
我们在浏览器中输入http://127.0.0.1:5000/,就可以在网页中看到'Hello World!'
了。
我们还可以使用debug
模式来运行flask
的服务端,开启debug
模式后,修改代码不需要关闭程序,可以实时生效。有多种方法来开启debug
模式:
app.run()
中添加参数,变为app.run(debug=True)
;run
之前增加app.debug = True
;config
文件,在config
文件中添加DEBUG = True
,然后在程序中引入app.config.from_object(config)
;run
之前增加app.config['DEBUG'] = True
;我们使用第3种方法,新建一个独立的文件来保存各种参数,以后项目增大的时候参数增多,便于管理。同样在项目文件夹下新建config.py
文件,添加DEBUG = True
,DEBUG
需大写。
巧用配置文件来配置参数config.py
1、 新建一个config.py文件
比如之前的那种配置Debug模式的方法可以通过config文件来配置的。
config.py
#encoding: utf-8
DEBUG = True # 改成False就可以关闭DEBUG模式
# 配置文件还可以配置
# SECRET_KEY
# SQLALCHEMY_DB
# APP_ROOT
2、在主app文件中导入这个文件,并且配置到app中,示例代码如下:
main.py
#encoding: utf-8
from flask import Flask
import config
app = Flask(__name__)
app.config.from_object(config) # 这样也可以配置成DEBUG模式,如果通过from_object的方式,那么配置文件中的字母必须全部都是大写,否则会有问题
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__=='__main__':
app.run(debug=app.config['DEBUG'])
3、还有许多的其他参数,都是放在这个配置文件中,比如SECRET_KEY和SQLALCHEMY这些配置,都是在这个文件中。
在HarpQA.py
中import config
并添加app.config.from_object(config)
,再次运行HarpQA.py
,提示:
* Restarting with stat
* Debugger is active!
* Debugger PIN: 229-291-890
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
说明Debug
模式已经打开,我们可以直接修改代码,例如把'Hello World!'
修改成'Hello'
并保存,显示:
* Detected change in 'D:\\Flask\\HarpQA\\HarpQA.py', reloading
* Restarting with stat
* Debugger is active!
* Debugger PIN: 229-291-890
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
说明DEBUG
模式检测到了代码的变化并自动重载了,这时候刷新网页,结果也变成了只显示'Hello'
。
如果我们要处理很多URL
,可以一个一个去给他们写对应的视图函数,这有时候是不切实际的,我们有更高效的做法,如以下代码:
@app.route('//')
def hello(name):
return 'Hello %s' % name
@app.route
中装饰的地址是'/
,注意name
外面用了尖括号,代表name
是一个参数,例如我们请求http://127.0.0.1:5000/Harp/这个网址,其中的name
就是Harp
,这个参数会传递给视图函数hello
,最终会返回'Hello Harp'
。我们可以给将
写成
,表示传入的参数是字符串类型的,其他的类型还有int
,float
,path
,几种类型的区别可以在网上搜索对比一下,例如path
可以将参数里的'/'
也传递过来。
flask系列---反转函数url_for与重定向redirect(二)