1.Flask简介
- flask是一款非常流行的Python Web框架,作者是Armin Ronacher,主要有这些优点。
- 微框架、简洁、给开发者提供了很大的扩展性。
- Flask和相应的插件功能丰富,用起来高效,此外灵活性相较Django框架更高。
- 开发效率很高,使用SQLAlchemy的ORM操作数据库可以节省开发者的时间。
- 使用Flask开发数据库的时候,具体使用SQLAlchemy还是MongoEngine,选择取决于开发者自己。区别于Django,Django内置了非常完善和丰富的功能。想要更换非常麻烦。
- 把默认的Jinija2模板引擎替换成其他模板引擎十分容易。
入门flask框架项目
#coding: utf8
# 从flask框架中导入Flask类
from flask import Flask
# 传入__name__初始化一个Flask实例
app = Flask(__name__)
# app.route装饰器映射URL和执行的函数。这个设置将根URL映射到了hello_world函数上
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
# 运行本项目,host=0.0.0.0可以让其他电脑也能访问到该网站,port指定访问的端口。默认的host是127.0.0.1,port为5000
app.run(host='0.0.0.0', port=9000)
此时点击执行,在浏览器中就会显示结果,但是app.run的方式只适合开发环境,在生产环境中,应该使用Gunicorn或者uWSGI来启动。在终端环境运行的,可以按ctrl+c来让服务停止。
- pycharm开启debug模式和修改host
在pycharm社区版本中,如果想要开启debug模式和更改端口号,则需要编辑项目配置。直接在app.run中更改是无效的。
pipenv
pip install pipenv
# windows下安装pipenv
- 安装flask框架创建虚拟环境会出现pipfile文件
url # 指定国内pip源,不然下载库会很慢
dev-packages # 开发环境
packages # 生产环境
django = "*" # *表示最新版本
requires # Python版本
进入/退出/删除虚拟环境
pipenv shell # 进入虚拟环境
exit # 退出虚拟环境
pipenv --rm # 删除整个环境 不会删除pipfile
2项目配置
- DEBUG模式:flask默认情况下不会开启DEBUG模式,开启以后,代码如有错误会在终端进行提示。
开启DEBUG模式
- 直接在对象上设置
app.debug = True
app.run()
- 在对象执行run方法时,传递参数
app.run(debug=True)
- 在config属性中直接配置
#app.config属于dict以及list实例,因此有下面两种配置方法
app.config.update(DEBUG=True)
app.config.update({'DEBUG':True})
- 正常开启debug模式
* Debug mode: on
* Restarting with stat
* Debugger is active!
* Debugger PIN: 140-448-607
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
注意:只能在开发环境下开启DEBUG模式,因为这会有非常大的安全隐患。另外,在堆栈模式里边查看变量值的时候,页面会弹出对话框提示输入PIN值。这样做的目的是为了更加安全。
通过配置文件的方式开启DEBUG模式
由于flask项目的配置文件都是通过app.config对象进行配置。因此
- 硬编码设置
app = Flask(__name__)
app.config['DEBUG'] = True
- config是继承自dict类
app.config.update(
DEBUG=True,
SECRET_KEY='...'
)
- 额外创建一个模块
# 1. 通过模块字符串
app.config.from_object('settings')
# 2. 通过模块对象
import settings
app.config.from_object(settings)
- 通过from_pyfile方法调用,该方法传递的是一个以.py结尾的文件名
app.config.from_pyfile('settings.py',silent=True)
3.URL与视图
- URL与函数的映射
一个URL要与函数进行映射,在框架里使用的是@app.route装饰器。在装饰器中可以指定URL的规则来进行更加详细的映射。
实例:
@app.route('/article/<id>/')
def article(id):
return '%s article detail' % id
# id的值按照指定的规则进行传递
固定写法为<converter:variable>其中converter为类型的名称,variable为自己定义的名字。如<string:id>。
- 常用的数据类型有:
- string:URL默认的数据类型,接收不含斜杠的字符串
string:/斜杠是作为参数的分隔符,不能在后面添,加路由后边如果以/结尾,在浏览器末尾加不加斜杠/都可以。反之不行
- int:整型。只能接收整型数据
<int:sid>
#sid只能是整型数据,否则就会出错
- float:浮点型
- Path:和string类似,但是可以接收分隔符/。
- uuid:uuid类型的字符串(比较少见)
- any:指定多种路径
@app.route('/<any(article,blog):url_path>/')
def item(url_path):
return url_path
** 传统的参数传递**
- GET方法:request.args.get(‘xxx’),在路由中后接?xxx=yyy,就可以获取xxx的值
@app.route('/ie')#默认是GET请求
def baidu():
return request.args.get('name')
#/ie?name=xxx
- POST方法:request.form.get(‘xxx’),在路由中,POST请求市在form表单里的。
@app.route('/ie',methods='POST')
#通过methodsd可以指定某种方法来支持HTTP请求,默认是GET方法
def baidu():
return request.form.get('name')
# /ie?name=xxx
4.url_for构造URL
- 正常情况下通过url路由可以执行函数,反过来,通过函数名字可以获取这个URL路由。
语法:url_for(‘函数名’,其他参数作为查询参数,)
from flask import Flask,url_for
app = Flask(__name__)
@app.route('/article/<id>/')
def article(id):
return '%s article detail' % id
@app.route('/')
def index():
print(url_for("article",id=1))
return "首页"
相对于硬编码的方法,url_for的好处是
- 以后修改了url路径,可以直接通过函数名,在后面添加相应参数即可,无需修改路由url。
- url_for()函数可以自己转义一些特殊字符。
@app.route('/')
def shili():
print(url_for('article_list', aid=1, page=1, name=1, t=1))
@app.route('/article/<aid>/')
def article_list(aid):
print(url_for('shili', next='/'))
#?next=%2F
5.页面跳转和重定向
- 重定向在浏览器上体现的就是页面的跳转
- 重定向分为:
-
永久性重定向(状态码:301):常用于旧网址废弃跳转到新的网址。
-
临时性重定向(状态码:302):
访问某种需要登陆权限的网站,临时跳转到登陆页面。
语法:flask.redirect(location,code=302)
location表示需要重定向到的URL,code表示采用永久还是临时的重定向。一般配合url_for使用
from flask import Flask,request,redirect,url_for
app = Flask(__name__)
@app.route('/')
def login():
return 'login'
# 状态码302表示临时重定向 301表示永久重定向
@app.route('/profile/')
def profile():
name = request.args.get('name')
if name:
return name
else:
return redirect(url_for('login'),code=301)
if __name__ == '__main__':
app.run(debug=True)
6.响应Response
在视图函数中,return返回的值只能是:字符串,元组,字典,以及Response对象
- Response对象
from flask import Flask, Response,make_response
app = Flask(__name__)
@app.route('/about/')
def about():
return Response('duke-coder',status=200,mimetype='text/html')
#Response('返回的字符串',status:200,mimetype:'返回的类型')status是状态码
- 使用make_response创建Response对象,该方法可以设置额外的参数数据。
from flask import make_response
@app.route('/about/')
def about():
return make_response('dk_coder')
- 返回元组
from flask import Flask
app = Flask(__name__)
@app.route('/about/')
def about():
return ('ph','sdf')# 只会返回第一个
return 'phf',404 #元组常见写法
# 元组一般只会返回第一个,404表示状态码
- 返回字符串
from flask import Flask
app = Flask(__name__)
@app.route('/')
def about():
return 'dk-coder'
- 返回字典
from flask import Flask, Response,make_response
app = Flask(__name__)
@app.route('/')
def about():
return {1:'duke',2:'asf',3:'as'}