Flask框架学习(一)----创建app对象、路由、abort函数与自定义异常处理、cookie

框架的轻重

  1. 重量级的框架:为方便业务程序的开发,提供了丰富的工具、组件,如Django

  2. 轻量级的框架:只提供Web框架的核心功能,自由、灵活、高度定制,如Flask

明确web开发的任务

  1. 视图开发:根据客户端请求实现业务逻辑(视图)编写

  2. 模板、数据库等其他的都是为了帮助视图开发,不是必备的

认识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项目创建过程

  1. 在指定文件夹下创建虚拟环境 venv
    命令:pip3 install virtualenv。
  2. 激活虚拟环境,进入venv/Scrpts目录下执行activate.bat批处理进行激活
    命令:activate.bat
  3. 下载flask所需要的扩展包
    命令:pip install –r package.txt
    package.txt:具体包的名称及其版本号
	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

Flask的Hello World程序

# 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()

Flask创建app对象

1.初始化参数

  • import_name:
  • static_url_path:
  • static_folder: 默认‘static’
  • template_folder: 默认‘templates’
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.配置参数

  • app.config.from_pyfile(“yourconfig.cfg”)
  • app.config.from_object()
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.在视图读取配置参数

  • app.config.get()
  • current_app.config.get()
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处理
Flask框架学习(一)----创建app对象、路由、abort函数与自定义异常处理、cookie_第1张图片

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 request
  • 就是 Flask 中表示当前请求的 request 对象,request对象中保存了一次HTTP请求的一切信息。
  • args get请求时,记录请求中的所有的参数,返回一个类字典格式数据类型。
  • form post 请求时, 记录请求中的所有的参数,返回一个类字典格式数据类型。
  • Flask框架学习(一)----创建app对象、路由、abort函数与自定义异常处理、cookie_第2张图片
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()

abort函数与自定义异常处理

1.abort函数

  • 如果在视图函数执行过程中,出现了异常错误,我们可以使用abort函数立即终止视图函数的执行。通过abort函数,可以向前端返回一个http标准中存在的错误状态码,表示出现的错误信息。
  • 使用abort抛出一个http标准中不存在的自定义的状态码,没有实际意义。如果abort函数被触发,其后面的语句将不会执行。其类似于python中raise。
  • from flask import 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()

cookie

#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()

你可能感兴趣的:(Flask)