Flask Web开发
Flask主要依赖三个库:
Jinja2:默认的模板引擎,Flask替换成其他模板引擎都非常容易
Werkzeug:一个包含WSGI,路由,调式的工具集
Itsdangerous:基于Django签名模块的签名实现。
FLask本身保持了内核的精简
Web程序不可避免要和数据库打交道,使用SQLAlchemy,MongoEngine,不用ORM(对象关系映射)而直接基于MySQL-python这样的底层驱动进行开发都是可以的。
from flask import Flask#引入FLask类,Flask类实现了一个WSGI应用
app = Flask(__name__)#app是Flask的实例
@app.route("/") # 该装饰器会将URL和执行的视图函数的关系保存道app.url_map属性上。
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run(host='0.0.0.0',port=8000)
默认Flask只监听虚拟机的本地127.0.0.1这个地址,端口为5000
0.0.0.0表示监听所有地址
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def home():
return '<h1>Home</h1>'
#同一个URL/signin分别有GET和POST两种请求,映射到两个处理函数中
@app.route('/signin', methods=['GET'])#GET请求,映射到signin_form()函数,函数体返回一个html
def signin_form():
return '''<form action="/signin" method="post">
<p><input name="username"></p>
<p><input name="password" type="password"></p>
<p><button type="submit">Sign In</button></p>
</form>'''
@app.route('/signin', methods=['POST'])#POS请求,映射道signin()函数,
def signin():
# 需要从request对象读取表单内容:
if request.form['username']=='admin' and request.form['password']=='password':
return '<h3>Hello, admin!</h3>'
return '<h3>Bad username or password.</h3>'
if __name__ == '__main__':
app.run()
app.run(debug=true)
当程序由异常而进入错误堆栈模式,第一次点击某个堆栈想查看对应变量的值的时候,浏览器会弹出一个要求你输入这个PIN值的输入框
HTTP方法和使用场景:
GET:获取资源,GET操作应该是幂等的
HEAD:想要获取信息,但是只关系消息头
POST:创建一个新的资源
PUT:完整地替换资源或者创建资源。
DELETE:删除资源
OPTIONS:获取资源支持的所有HTTP方法
PATCH:局部更新,修改某个已有的资源
(幂等表示在相同的数据和参数下,执行一次或多次产生的效果是一样的。)
唯一URL
@app.route('/login/')#/login,/login/都会定位到同一URL
@app.route('/login')#/login正常,但/login/会报错
redirect(url_for('login'))#重定向到/login/
httpie是一个使用Python编写的,提供了语法高亮,JSON支持,可以替代curl的工具,它也可方便地集成到Python项目中。
#进入方法,如hello_world,return {'message': 'Hello World!'},则rv就是返回值{'message': 'Hello World!'},再把rv解析成json,打印出来
# coding=utf-8
from flask import Flask, jsonify
from werkzeug.wrappers import Response
app = Flask(__name__)
class JSONResponse(Response):
@classmethod
def force_type(cls, rv, environ=None):
if isinstance(rv, dict):
rv = jsonify(rv)
return super(JSONResponse, cls).force_type(rv, environ)
app.response_class = JSONResponse
@app.route('/')
def hello_world():
return {'message': 'Hello World!'}
@app.route('/custom_headers')
def headers():
return {'headers': [1, 2, 3]}, 201, [('X-Request-Id', '100')]
if __name__ == '__main__':
# app.run(host='0.0.0.0', port=5000)
app.run()
app.run(debug=true)
当程序由异常而进入错误堆栈模式,第一次点击某个堆栈想查看对应变量的值的时候,浏览器会弹出一个要求你输入这个PIN值的输入框
HTTP方法和使用场景:
GET:获取资源,GET操作应该是幂等的
HEAD:想要获取信息,但是只关系消息头
POST:创建一个新的资源
PUT:完整地替换资源或者创建资源。
DELETE:删除资源
OPTIONS:获取资源支持的所有HTTP方法
PATCH:局部更新,修改某个已有的资源
(幂等表示在相同的数据和参数下,执行一次或多次产生的效果是一样的。)
唯一URL
@app.route('/login/')#/login,/login/都会定位到同一URL
@app.route('/login')#/login正常,但/login/会报错
redirect(url_for('login'))#重定向到/login/
httpie是一个使用Python编写的,提供了语法高亮,JSON支持,可以替代curl的工具,它也可方便地集成到Python项目中。
#进入方法,如hello_world,return {'message': 'Hello World!'},则rv就是返回值{'message': 'Hello World!'},再把rv解析成json,打印出来
# coding=utf-8
from flask import Flask, jsonify
from werkzeug.wrappers import Response
app = Flask(__name__)
class JSONResponse(Response):
@classmethod
def force_type(cls, rv, environ=None):
if isinstance(rv, dict):
rv = jsonify(rv)
return super(JSONResponse, cls).force_type(rv, environ)
app.response_class = JSONResponse
@app.route('/')
def hello_world():
return {'message': 'Hello World!'}
@app.route('/custom_headers')
def headers():
return {'headers': [1, 2, 3]}, 201, [('X-Request-Id', '100')]
if __name__ == '__main__':
# app.run(host='0.0.0.0', port=5000)
app.run()
静态文件管理
Web应用大多会提供静态文件提供服务以便给用户更好的访问体验。静态文件主要包含CSS样式文件,JavaScript脚本文件,图片文件和字体文件等静态资源。
蓝图
蓝图通常作用于相同的URL前缀,比如/user/id,/user/profile,这些地址都以/user开头,那么它们就可以放在一个模块中。
# coding=utf-8
from flask import Blueprint
bp = Blueprint('user', __name__, url_prefix='/user')
#创建一蓝图
@bp.route('/')#/user
def index():
return 'User"s Index page'
@bp.route('/id/')#/user/id
def sub():
return 'User"s id page'
@bp.route('/profile/')#/user/profile
def sub():
return 'User"s profile page'
from flask import Flask
import chapter3.section1.user as user
app = Flask(__name__)
app.register_blueprint(user.bp)
if __name__ == '__main__':
app.run()
命令行接口
从Flask 0.11开始,Flask集成了Click,现在可以直接在命令行直接执行flask命令启动Flask应用了。
@app.cli.command
模板
Jinja2是Flask默认的仿Django模板的一个模板引擎,由Flask的作者开发。
模板里支持调用方法
优点:
1.让HTML设计者和后端Python开发者工作分离
2.减少使用Python的复杂程度,页面逻辑应该独立于业务逻辑,这样才能开发出易于维护的程序
3.模板非常灵活,快速和安全,对设计者和开发者会更友好
4.提供了控制语句,继承等高级功能,减少开发的复杂度
模板仅仅是文本文件,它可以使用任何基于文本的格式(HTML,XML,CSV,LaTex等),它并没有特定的扩展名,通常使用.html作为后缀名。模板包含“变量”或“表达式”,这两者在模板求值的时候会被替换为值,模板中还有标签和控制语句。
下面是一个模板示例:
<!DOCTYPE html>#声明文档类型是HTML5
<html lang="en">
<head>
<title>Simple Page</title>
</head>
<body>
{#This is a Comment#}#{#...#}:模块注释,它不会出现在渲染的页面里
<ul id ="navigation">
{% for item in items %}#{%...%}:用于执行诸如for循环或赋值的语句
<li><a href="{{item.href}}">{{item['caption']}}</a></li>#{{...}}:用于把表达式的结果输出到模板上
{%endfor %}
</ul>
<h1>{{title|trim}}</h1>#trim是一个过滤器,在模板中通过管道符号(|)把变量和过滤器分开。
<p>{{content}}</p>
</body>
</html>
模板继承
#基模板
<!DOCTYPE html>
<html lang="en">
<head>
{% block head %}
<link rel="stylesheet" href="style.css" />
<title>{% block title %}{% endblock %} - My Webpage</title>
{% endblock %}
</head>
<body>
<div id="content">
{% block content %}
{% endblock %}
</div>
<div id="footer">
{% block footer %}
{% endblock %}
</div>
</body>
</html>
#{%block XXX%}...{%endblock%}是一个代码块,可以在子模板重载
子模板,继承于基模板
{% extends "base.html" %}#继承于模板base.html
{% block title %}Index{% endblock %}
{% block head %}
{{ super() }}
<style type="text/css">
.important { color: #336699; }
</style>
{% endblock %}
{% block content %}
<h1>Index</h1>
<p class="important">
Welcome on my awesome homepage.
</p>
{% endblock %}
Flask,服务端,客户端通信:https://blog.csdn.net/yelena_11/article/details/53404892

浙公网安备 33010602011771号