flask
一、虚拟环境安装
安装 pipenv 管理 python 开发环境
pip install pipenv
pipenv install --dev six # 只将模块安装到开发环境中
pipenv shell # 进入虚拟环境
exit # 退出虚拟环境
pipenv --rm # 删除整个环境 不会删除pipfile 退出环境再进行删除
pipenv # 查看更多命令帮助
pipenv --venv # 查看虚拟环境位置
在使用 pycharm 开发时,需要找到对应的 python.exe (也就是设置对应的环境),为了方便管理环境,可以进行自定义设置
二、项目创建
利用 pycharm 创建项目(专业版)
app.run这种方式只适合于开发,如果在生产环境中,应该使用Gunicorn或者uWSGI来启动。如果是在终端运行的,可以按ctrl+c来让服务停止。
直接创建
@app.route("/") 代表访问的是 / 也就是根目录
hello_world 函数就是首页实现的效果
虽然访问 http://127.0.0.1:5000/ 的时候不写/ 也可以访问到首页,但是这样写让代码一目了然
app.run() 让项目跑起来
跑项目的时候需要注意项目的环境的正确配置,避免项目启动失败哦。
三、启动项目和开启 Debug 模式
、
上面非 Debug 模式进行调试项目需要每次重启项目,所以更改代码,开启 Debug 模式
# 方法一
app.run(debug=True)
# 这个方法有一个 port 参数来改变端口值
# 方法二
# app.debug = True
# app.run()
# 方法三
# app.config 是个继承字典的类 使用update方法
# app.config.update(DEBUG=True)
# app.run()
# 使用配置文件帮助代码管理
# app.config.from_object(config)
# app.run()
Debugger PIN: 758-272-092 在报错的情况下,可直接提供在显示页面进行调试的通信证
四、项目配置
Flask项目的配置,都是通过app.config对象来进行配置的。比如要配置一个项目处于DEBUG模式下,那么可以使用app.config['DEBUG] = True来进行设置,那么Flask项目将以DEBUG模式运行。在Flask项目中,有四种方式进行项目的配置
- 直接硬编码
app = Flask(__name__)
app.config['DEBUG'] = True
- 因为app.config是flask.config.Config的实例,而Config类是继承自dict,因此可以通过update方法
app.config.update(
DEBUG=True,
SECRET_KEY='...'
)
- 如果你的配置项特别多,你可以把所有的配置项都放在一个模块中,然后通过加载模块的方式进行配置,假设有一个settings.py模块,专门用来存储配置项的,此时你可以通过app.config.from_object()方法进行加载,并且该方法既可以接收模块的的字符串名称,也可以模块对象
# 1. 通过模块字符串
app.config.from_object('settings')
# 2. 通过模块对象
import settings
app.config.from_object(settings)
4.也可以通过另外一个方法加载,该方法就是app.config.from_pyfile(),该方法传入一个文件名,通常是以.py结尾的文件,但也不限于只使用.py后缀的文件
app.config.from_pyfile('settings.py',silent=True)
from juran
五、URL 与函数映射
一个URL要与执行函数进行映射,使用的是@app.route装饰器。@app.route装饰器中,可以指定URL的规则来进行更加详细的映射。
案例:映射一个文章详情的URL
语法提示:尖括号是固定写法< variable >,指定类型则要写成 < converter:variable >
string: 默认的数据类型,接受没有任何斜杠/的字符串
# 设置一个列表页面
# http://127.0.0.1:5000/list/12
@app.route("/list/<aid>")
def article_list(aid):
return "这是第{}篇文章".format(aid)
# 不接受除了数字之外的
@app.route("/list/<int:aid>")
def article_list(aid):
return "这是第{}篇文章".format(aid)
# detial 页面
# 接受参数为 / 和字母 纯数字则调用回 article_list
@app.route("/list/<path:aid>")
def article_detail(aid):
return "detial-这是第{}篇文章".format(aid)
url 地址 匹配对比:
同时兼具 int 和 path
# /<any(article, blog):url_path>/ 冒号后面不可以加空格
@app.route("/<any(article, blog):url_path>/")
def item(url_path):
return url_path
通过传统的?=的形式来传递参数,可以通过request.args.get(‘id’)来获取id的值。
如果是post方法,则可以通过request.form.get(‘id’)来进行获取。
# http://127.0.0.1:5000/wd?name=aa
@app.route("/wd")
def baidu():
return request.args.get("name")
url_for函数可以帮我们实现通过一个函数去获得这个URL。
url_for()函数接收两个及以上的参数,他接收函数名作为第一个参数,接收对应URL规则的命名参数,如果还出现其他的参数,则会添加到URL的后面作为查询参数。
# return 是页面信息
# 打印是在编译器控制台内进行打印
@app.route("/")
def index():
print(url_for("article_list", aid=2)) # article_list 有一个 aid 参数,在 url_for 的时候要带上
return "hello world"
@app.route("/article/<aid>/")
def article_list(aid):
return "article list {}".format(aid)
@app.route("/detail/<did>/")
def article_detail(did):
# print(url_for("index")) # index 没有参数传入 url
print(url_for("index", next="/")) # 传入不存在的参数 打印信息为/?next=%2F 这是对特殊字符/进行了转义
return "article detail {}".format(did)
在@app.route()中可以传入一个关键字参数methods来指定本方法支持的HTTP方法,默认情况下,只能使用GET请求
# methods 让其可以接收 GET','POST 两种请求
@app.route("/signup/", methods=['GET','POST'])
def login():
# print(type(request.args))
# get 请求
# http://127.0.0.1:5000/signup/?username=juju
print(request.args.get('username'))
# post 请求
# print(request.form.get("name"))
return "login"
在flask中,重定向是通过flask.redirect(location,code=302)这个函数来实现的,location表示需要重定向到的URL,配合url_for()函数来使用,code表示采用哪个重定向,默认是302也即暂时性重定向,可以修改成301来实现永久性重定向
# 访问 http://127.0.0.1:5000/profile/ 会被重定向 状态码302
@app.route("/profile/")
def profile():
name = request.args.get("name")
if name:
return name
else:
# 重定向
return redirect(url_for("login")) # code=301
return "nnn"
- Response对象,Response将该字符串作为主体,状态码为200,MIME类型为text/html,然后返回该Response对象。
from werkzeug.wrappers import Response
@app.route('/about/')
def about():
resp = Response(response='about page',status=200,content_type='text/html;charset=utf-8')
return resp
- 元组。元组中格式是(response,status,headers)。response为一个字符串,status值是状态码,headers是一些响应头。
return ('关于我们',200) # 只返回 关于我们
- dict
略
- 可以使用make_response函数来创建Response对象,这个方法可以设置额外的数据,比如设置cookie,header信息
rom flask import make_response
@app.route('/about/')
def about():
return make_response('about page') # 这个必须要有返回值
如果不是以上三种类型。那么Flask会通过Response.force_type(rv,request.environ)转换为一个请求对象