前段时间在学习Django,之后上周跟着老师做了一个项目,然后就没有怎么更新博客,这周在学习flask,然后就把本周的学习的内容大致总结一下。
1、什么是flask
Flask是基于Werkzeug,Jinja 2和良好意图的基于Python的微框架。
Django和flask都是基于Python的web框架
但是Django是一个集成的比较完善的一个web框架,你能想到的基本上Django都帮你封装好了,你想要进行私人订制的空间太小了,但是开发效率高。
flask是一个微框架,确实很‘轻’,也正是因为它很‘轻’,灵活性高你可根据自己的需要进行‘私人订制’。
2、创建flask项目和一些基本配置
在Windows下使用Pycharm创建flask项目
选图中的Flask,选择创建项目的路径,最重要的是你配置flask的项目环境,我们一般在创建项目前先为项目创建一个Python解释器的虚拟环境。这里配置环境就不多说了,前面专门讲了如何配置虚拟环境。只是在该环境需要安装Flask包
pip install Flask
使用Pycharm创建的flask项目自带了两个文件夹(static和templates)和一个py文件(和你创建的文件名一样)里面的初始代码:
from flask import Flask
app = Flask(__name__)
@app.route('/') # 路由
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
# 启动项目
# debug=True(启动调试模式,可以在网页看到自己的错误)
# port='8000'(端口)
# host= '0.0.0.0'Ip地址
# app.run(debug=True, port='8000')
app.run()
我们可以运行该py文件一个flask项目就运行起来,默认的端口号是5000,只要访问 http://127.0.0.1:5000/你就可以网页看到一个Hello World!,在run()中我们可配置debug,port和host等参数,如果在网页上调试不是一个好的idea,所以我们对项目进行改装成Django的运行模式通过Python manage.py runserver来启动项目。
1、创建自己的app文件夹
创建一个init.py和views.py文件
app/init.py
from flask import Flask
def create_app():
app = Flask(__name__)
return app
再把和app文件夹平级的启动.py文件改成manage.py
manage.py
from flask_script import Manager
from app import create_app
# 初始化,__name__代表主模块名或者包
blue = create_app()
manager = Manager(app=blue)
if __name__ == '__main__':
manager.run()
通过上面的操作我们就可以通过Python manage.py runserver来启动我们的项目了,但是现在没有视图,现在我们需要配置自己的视图,在flask中我们通过flask中我们通过blueprint(蓝图)来管理url。
app/views.py
from flask import render_template, request, make_response, redirect
from flask import Blueprint, send_file, url_for, abort
# Blueprint通过把实现不同功能的module分开,从而把一个大的application分割成各自实现不同功能的module。
# 在一个Blueprint中可以调用另一个blueprint的view function, 但要加相应的blueprint名。
blue = Blueprint('first', __name__)
# methods=['POST', 'GET']可以指定请求方式
@blue.route('/', methods=['POST', 'GET']) # url 路由(127.0.0.1::5000)
def hello_world(): # 视图函数
return 'Hello World!'
把创建好的blue在app/init.py进行初始化:
from flask import Flask
from app.views import blue
def create_app():
app = Flask(__name__)
# url_prefix='/app'蓝图前缀用来区分不同的app
app.register_blueprint(blueprint=blue, url_prefix='/app') # 初始化注册的蓝图
return app
现在启动项目我们就可以 访问127.0.0.1:5000/可以看到Hello World!
我们在创建项目的时候项目自动帮我们创建了两个文件夹(static和templates),static主要放置一些js、css、image等静态文件的配置,templates主要是放置一些网页。
下面配置访问static和templates
app/init.py
import os
from flask import Flask
from app.views import blue
def create_app():
# os.path.abspath(__file__):'D:\\envFlaskWorkSpace\\day1.1\\app\\views.py'
# os.path.dirname(os.path.abspath(__file__)):'D:\\envFlaskWorkSpace\\day1.1\\app'
# os.path.dirname(os.path.dirname(os.path.abspath(__file__))):'D:\\envFlaskWorkSpace\\day1.1'
# 也就是BASE_DIR = 'D:\\envFlaskWorkSpace\\day1.1'
# 再把templates和static加入到基础路径里
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
templates_dir = os.path.join(BASE_DIR, 'templates')
static_dir = os.path.join(BASE_DIR, 'static')
app = Flask(__name__, static_folder=static_dir, template_folder=templates_dir)
# url_prefix='/app'蓝图前缀用来区分不同的app
app.register_blueprint(blueprint=blue, url_prefix='/app') # 初始化注册的蓝图
return app
这样我们就完成static和templates路径的配置
3、路由
现代Web应用程序使用有意义的URL来帮助用户。如果页面使用他们可以记住并用于直接访问页面的有意义的URL,用户更可能喜欢页面并返回。
使用route()装饰器将一个函数绑定到一个URL。
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello, World'
Django的路由设计是采用集中处理的方法,利用正则匹配。
4、变量规则
您可以通过标记部分将可变部分添加到URL 。您的函数然后接收 作为关键字参数。或者,您可以使用转换器来指定参数的类型
@blue.route('/hello/<name>/') # <name>是字符串类型
def hello_man(name):
print(type(name))
return 'hello name:%s' % name
@blue.route('/helloint/<int:id>/') #<int:id> 指定id是整型
def hello_int(id):
print(type(id))
a = 'xlsb'
return 'hello int:%s' % id
@blue.route('/getfloat/<float:price>/') #<float:price> 指定price是浮点型
def hello_float(price):
return 'float:%s' % price
@blue.route('/getstring/<string:str>/') #<string:str> 指定str是字符串类型
def hello_string(str):
return 'string:%s' % str
@blue.route('/getpath/<path:url_path>/') # <path:url_path>
def hello_path(url_path): # 如果请求的url是:127.0.0.1:8070/getpath/fhdjhf/df/sdf/
# 后面的url_path:fhdjhf/df/sdf/把'/'也看成字符串
return 'path:%s' % url_path
@blue.route('/getuuid/')
def hello_uuid():
a = uuid.uuid4()
return str(a)
@blue.route('/getbyuuid/<uuid:uu>/')
def hello_by_uuid(uu):
return 'uuid:%s' % uu
转换器类型:
类型 | 描述
string | (默认)接受不带斜杠的文本
int | 接受正整数
float | 接受正浮点值
path | 喜欢,string但也接受斜线
uuid | 接受UUID字符串
5、请求(request)
我们可以通过route()函数添加关键字参数methods=[‘GET’, ‘POST’]来配置请求方式
我们可以通过request.args来获取GET请求的参数,可以通过request.form来获取表单提交的参数。
from flask import render_template, request, make_response, redirect
from flask import Blueprint, url_for, abort
# 请求
@blue.route('/getrequest/', methods=['GET', 'POST'])
def get_request():
args = request.args # 获取GET请求后传的参数
form = request.form # 获取POST请求的参数
return '获取request'
我们在获取表单传来的数据的话使用request.form[‘key’]和request.form.get(‘key’, None),建议使用get方法表单参数,KeyError的话如果用前面的一种方法可能就会报错,如果用get方法可以给一个默认的参数,这样用户在提交空表单时不至于程序崩溃。
6、响应
我们通过make_response()函数来获取响应对象
# 响应
@blue.route(('/makeresponse/'))
def make_responses():
response = make_response('<h2>into the new world</h2>')
return response
7、错误
@blue.route('/makeabort/')
def make_abort():
abort(404)
return '终结'
@blue.errorhandler(404)
def get_error(exception):
return '捕捉异常:%s' % exception
这是一个毫无意义的例子
默认情况下,显示每个错误代码的黑白错误页面。如果你想定制错误页面,你可以使用 errorhandler()装饰器: