重量级的框架:为方便业务程序的开发,提供了丰富的工具、组件,如Django
轻量级的框架:只提供Web框架的核心功能,自由、灵活、高度定制,如Flask
视图开发:根据客户端请求实现业务逻辑(视图)编写
模板、数据库等其他的都是为了帮助视图开发,不是必备的
简介
Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login),都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验证等。Flask没有默认使用的数据库,你可以选择MySQL,也可以用NoSQL。其 WSGI 工具箱采用 Werkzeug(路由模块) ,模板引擎则使用 Jinja2 。
可以说Flask框架的核心就是Werkzeug和Jinja2。
与Django对比
django提供了:
django-admin快速创建项目工程目录
manage.py 管理项目工程
orm模型(数据库抽象层)
admin后台管理站点
…
而这些,flask都没有,都需要扩展包来提供
Flask扩展包
Flask-SQLalchemy:操作数据库;
Flask-migrate:管理迁移数据库;
Flask-Mail:邮件;
Flask-WTF:表单;
Flask-script:插入脚本;
Flask-Login:认证用户状态;
Flask-RESTful:开发REST API的工具;
Flask-Bootstrap:集成前端Twitter Bootstrap框架;
Flask-Moment:本地化日期和时间;
Flask项目创建过程
alembic==0.9.4
amqp==2.2.2
billiard==3.5.0.3
celery==4.1.0
certifi==2017.7.27.1
chardet==3.0.4
Flask==0.10.1
Flask-Migrate==2.1.0
Flask-Script==2.0.5
Flask-Session==0.3.1
Flask-SQLAlchemy==2.2
Flask-WTF==0.14.2
idna==2.5
itsdangerous==0.24
Jinja2==2.9.6
kombu==4.1.0
Mako==1.0.7
MarkupSafe==1.0
MySQL-python==1.2.5
olefile==0.44
Pillow==4.2.1
pycryptodome==3.4.7
python-alipay-sdk==1.4.0
python-dateutil==2.6.1
python-editor==1.0.3
pytz==2017.3
qiniu==7.1.4
redis==2.10.5
requests==2.18.3
six==1.10.0
SQLAlchemy==1.1.12
urllib3==1.22
vine==1.1.4
Werkzeug==0.12.2
WTForms==2.1
# coding:utf-8
# 导入Flask类
from flask import Flask
#Flask类接收一个参数__name__
app = Flask(__name__)
# 装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
return 'Hello World'
# Flask应用程序实例的run方法启动WEB服务器
if __name__ == '__main__':
app.run()
1.初始化参数
from flask import Flask
"""
1.static_folder = "static":修改静态目录
2.static_url_path:用于改变url访问静态资源的路径,
默认url是static,默认访问static目录 注意缓存
3.template_folder:模板文件目录,默认是templates
"""
app =Flask(
__name__,
static_folder="static",
# static_folder="statics"
static_url_path="/python",
template_folder="templates",
)
@app.route("/index/")
def index():
return "index..."
if __name__ == '__main__':
app.run()
2.配置参数
from flask import Flask
app = Flask(__name__)
#1.第一种的方式,通过配置文件设置参数
#告诉app 加载配置文件
# app.config.from_pyfile('config.txt')
#2.第二种方式,通过对象的方式
# class Config(object):
# DEBUG = True
# app.config.from_object(Config)
#3第三种方式,字典方式
app.config["DEBUG"] = True
@app.route("/index/")
def index():
a=1/0
return "index.."
if __name__ == '__main__':
app.run()
3.在视图读取配置参数
from flask import Flask
app = Flask( __name__,)
class Config(object):
DEBUG = True
PI = 3.14
app.config.from_object(Config)
@app.route("/")
def index():
ret = app.config.get("PI") #获取常量
print(ret)
return "index..."
if __name__ == '__main__':
app.run(port=8000) #修改端口号
4.app.run的参数
app.run(host=”0.0.0.0”, port=5000)
1.app.url_map 查看所有路由
2.利用methods限制访问方式
3.同一路由装饰多个视图函数
4.同一视图多个路由装饰器
5.使用url_for进行反解析
from flask import Flask
app = Flask(__name__)
#6.同一路由可以装饰多个视图函数
@app.route("/index/")
def index1():
return "hello !!!"
@app.route("/index/")
def index1_1():
return "world !!!"
#3.methods=["GET","POST"] 设置访问方式
#注意:如果既可以使用GET又可以使用POST请求,需要都声明出来。
@app.route("/index/",methods=["GET","POST"])
def index2():
return "world!!!"
#4.同一个视图函数可以添加多个路由,两种都可以访问
@app.route("/")
@app.route("/index/")
def index3():
return "hello world!!!"
#5.重定向
from flask import redirect,url_for
@app.route("/login/")
def login():
#业务逻辑判断
#重定向到首页
# return redirect("/")
#使用url_for()函数,传入视图名称
return redirect(url_for("index"))
if __name__ == '__main__':
#2.可以通过url_map来查看整个flask中毒的路由信息
print(app.url_map)
# Map([ < Rule
# '/index/'(GET, HEAD, OPTIONS) -> index >,
# < Rule
# '/static/'(GET, HEAD, OPTIONS) -> static >])
#1.debug=True 开启DEBUG模式
app.run(debug=True)
6.动态路由
获取路由中传递的参数,路由传递的参数默认当做string处理
from flask import Flask
app = Flask(__name__)
#127.0.0.1:5000/goods_detail/3
@app.route("/goods_detail/")
def goods_detail(page):
print("page:",page)
print(type(page))# 默认是字符串类型
return "goods_detail..."
#指定类型 int:接受整数
@app.route("/index/")
def index(page):
return "index page:{}".format(page)
#指定类型 path:可以接收路径中包含‘/’的值
@app.route("/index2/")
def index2(page):
return "index page:{}".format(page)
if __name__ == '__main__':
print(app.url_map)
app.run(debug=True)
7.获取请求参数
from flask import Flask
app = Flask(__name__)
#get 方式
#1.导入requset
from flask import request
@app.route("/get_method/")
def get_method():
#2.通过args获取参数
name = request.args.get("name")
age = request.args.get("age")
return "get_method-->name:{},age:{}".format(name,age)
#post方式
#1.导入render_template
from flask import render_template
@app.route("/register/",methods=["GET","POST"])
def register():
#2.获取参数
if request.method =="POST":
username = request.form.get("username")
password = request.form.get("password")
return "注册成功!!!username:{},password:{}".format(username,password)
return render_template("register.html")
if __name__ == '__main__':
app.run(debug=True)
8.上传文件
已上传的文件存储在内存或是文件系统中一个临时的位置。你可以通过请求对象的 files 属性访问它们。每个上传的文件都会存储在这个字典里。它表现近乎为一个标准的 Python file 对象,但它还有一个 save() 方法,这个方法允许你把文件保存到服务器的文件系统上。
from flask import Flask,render_template,request
app = Flask(__name__)
@app.route("/upload/",methods=["GET","POST"])
def upload():
if request.method =="POST":
file_obj = request.files.get("pic")
print(file_obj)
print(file_obj.filename)#获取上传文件的文件名称
print(type(file_obj.filename))
path = "static/"+file_obj.filename
#方式一:
# with open(path,mode="wb") as f:
# f.write(file_obj.read())
#方式二:
file_obj.save(path)
return '上传成功了!!!'
return render_template("upload.html")
if __name__ == '__main__':
app.run()
1.abort函数
2.自定义异常处理
@app.errorhandler(404)
def error(e):
return ‘您请求的页面不存在了,请确认后再次访问!%s’
from flask import Flask
app = Flask(__name__)
#1.导入abort
from flask import abort,Response
@app.route("/index/")
def index():
# abort(404) #返回标准状态码
print("?????")
response = Response("404,页面不存在,请重新访问!!") #返回提示内容
abort(response)
return "index..."
#捕获项目中的404异常
@app.errorhandler(404)
def error(err):
#err参数:页面默认的错误信息
print(err)
return "404,页面不存在,请重新访问!!"
if __name__ == '__main__':
app.run()
#1.导入make_respose模块
from flask import Flask,make_response,request,redirect
app = Flask(__name__)
#2.设置cookie
@app.route("/set_cookie/")
def set_cookie():
response = make_response("set_cookie successful!!")
response.set_cookie("name","dd")
response.set_cookie("age","18")
response.set_cookie("height","178",max_age=10)#设置cookie过期时间 单位(s)
return response
#3.获取cookie
@app.route("/get_cookie/")
def get_cookie():
name = request.cookies.get("name")
age = request.cookies.get("age")
height = request.cookies.get("height")
return "get_cookie-->name:{},age:{},herght:{}".format(name,age,height)
#4.删除cookie
@app.route("/delete_cookie/")
def delete_cookie():
response = make_response("delete_cookie successful")
response.delete_cookie("name")
return response
#5.重定向不能删除cookie,因为返回了一个新的响应
#删除cookie的本质是设置过期时间
@app.route("delete_cookie")
def delete_cookie2():
response = make_response("delete_cookies successful!!!")
response.delete_cookie("name")
return redirect("/get_cookie/")
if __name__ == '__main__':
app.run()