@WEB工作原理
1.C/S和B/S架构 c:client s:server b:browser s:server
2.B/S工作原理
客户端(浏览器) <=> WEB服务器(nginx/apache) <=> Python(Flask) <=> 数据库(MySQL)
@Flask框架
1.简介
是一个非常小的python web框架,被称为微型框架,只提供了一个强健的核心,其它的功能都要使用扩展来实现。意味着可以根据自己的项目需求量身打造。遵循BSD证书。
官网http://flask.pocoo.org/
附各种证书说明:
2. 组成
1. 调试、路由、WSGI系统
2. 模板引擎(Jinja2,Flask的核心人员开发)
3. windows下安装
第一步:mkvirtualenv -p C:\Users\My\AppData\Local\Programs\Python\Python36\python.exe flaskenv
第二步:pip install flask -i https://pypi.douban.com/simple/
Flask 依赖两个外部库: Jinja2 模板引擎和 Werkzeug WSGI 套件
4. 第一个程序
# 导入Flask类库
from flask import Flask
# 创建应用实例
app = Flask(__name__)
# 创建视图函数
@app.route('/')
def index():
return 'Hello Flask !'
# 启动应用实例
if __name__ == '__main__':
app.run()
默认访问地址:http://127.0.0.1:5000
5. 启动参数
参数 | 说明 |
---|---|
debug | 是否开启调试模式,开启后有错误提示,代码修改后可以重新启动 |
threaded | 开启多线程,默认是不开启的 |
port | 指定端口号 |
host | 指定主机,设置为‘0.0.0.0’后可以通过ip地址进行访问 |
6. 请求与响应
1.变量或对象
变量/对象 | 上下文 | 说明 |
---|---|---|
current_app | 程序上下文 | 当前运行的程序实例 |
request | 请求上下文 | 请求对象,保存了客户端的所有的HTTP请求信息 |
session | 请求上下文 | 用户会话,用于保存需要’记住’的会话信息 |
g(global的简写) | 程序上下文 | 处理请求时用作临时存储的对象,专门用来保存用户数据,每次请求都会重置,g对象在一次请求中的所有代码中都是可以使用的。 |
2. 请求钩子函数
from flask import Flask, g
app = Flask(__name__)
@app.route('/test/')
def test():
return g.string
@app.before_first_request
def bf_first_request():
g.string = 'before_first_request'
@app.before_request
def bf_request():
g.string = 'before_request'
ps:
# 注册一个函数,没有异常情况下,在每次请求之后运行.
# 注册的函数至少需要含有一个参数
# 这个参数实际上为服务器的响应,且函数中需要返回这个响应参数.
@app.after_request
def af_request(param):
param.set_cookie('username', 'xiaoming')
return param
7.视图函数
# 带参数的路由,不指定参数类型,默认是字符串
@app.route('/hello//')
def hello(username):
return 'Hello %s !' % username
# 参数可以指定类型:int、float、path(/不再是分隔符)
@app.route('/user//')
def user(uid):
return '%d号用户详细信息' % uid
@app.route('/path//')
def path(p):
return p
3.总结说明
3. 请求(request)
@app.route('/request/')
def req():
# 完整的请求URL
# return request.url
# 基本路由信息,不包含get参数
#return request.base_url
# 只包含主机和端口
#return request.host_url
# 只包含装饰器中的路由地址
#return request.path
# 请求方法类型
#return request.method
# 客户端IP地址
#return request.remote_addr
# 所有的请求参数(GET)
#return request.args['page']
# 请求头信息
return request.headers['User-Agent']
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Mozilla/5.0 :以前用于Netscape浏览器,目前大多数浏览器UA都会带有。
Windows NT 6.1:代表windows7系统。
WOW64:Windows-on-Windows 64-bit,32位的应用程序运行于此64位处理器上。
AppleWebKit/537.36:浏览器内核。
KHTML:一个HTML排版引擎。
like Gecko:这不是Geckeo 浏览器,但是运行起来像Geckeo浏览器。
Chrome/55.0.2883.87:Chrome版本号。
Safari/537.36:宣称自己是Safari?
9. 响应(response)
@app.route('/response/')
def response():
# 只要返回字符串就可以,默认状态码为200
#return 'ok'
# 可以指定状态码
#return 'page not found', 404
# 先使用专门的函数构造一个响应,然后返回,可以在构造时指定状态码
resp = make_response('我是提前构造好的响应', 404)
return resp
10. 重定向(redirect)
@app.route('/redirect/')
def new():
#return 'abc'
#return redirect('/')
# 根据视图函数,反向构造对应的路由,传递的参数是视图函数名
#return redirect(url_for('response'))
# 可以拼接路由参数,多余的参数会以get方式拼接在url后面
#return redirect(url_for('hello', username='xiaoming', page=2))
# 当需要构造外部跳转的链接时,需要将_external设置为True以构造完整路由
return url_for('hello', username='xx', _external=True)
url_for('hello') ==> /hello/
url_for('hello', _external=True) ==> http://127.0.0.0:5000/hello/
11. 终止(abort)
@app.route('/abort/')
def err():
# 使用abort不是说控制权归调用的函数所有,
# 而是向系统抛出一个异常,按照系统原有的异常处理方式进行处理
abort(404)
return 'error'
# 定制错误显示页面
@app.errorhandler(404)
def page_not_found(e):
return '老铁,有木有搞错'
12. 会话控制(cookie/session)
# 设置cookie
@app.route('/set_cookie/')
def set_cookie():
resp = make_response('cookie已设置')
expires = time.time() + 10
# 设置cookie,顺便可以指定过期时间
resp.set_cookie('name', 'xiaoming', expires=expires)
return resp
# 获取cookie
@app.route('/get_cookie/')
def get_cookie():
return request.cookies.get('name') or '你是哪个二哥'
# 设置秘钥,此处的秘钥不只是用于session的加密
app.config['SECRET_KEY'] = '123456'
# 设置session
@app.route('/set_session/')
def set_session():
session['username'] = 'xiaoma'
return 'session已设置'
# 获取session
@app.route('/get_session/')
def get_session():
return session.get('username', 'who are you?')
@flask_script扩展
1. 安装:pip install flask-script
2. 说明:
在项目测试完成后,上线时最好不要改动任何代码。只能通过终端的方式进行启动,通过传递不同的参数,完成特定的启动方式。很遗憾flask默认不支持命令行启动,然而幸运(^_^)的是有一个第三方库flask-script帮我们实现了这个功能。简单来说,它就是一个flask终端启动的命令行解析器。
3. 使用:
# 导入类库
from flask_script import Manager
# 创建对象
manager = Manager(app)
# 启动应用实例
if __name__ == '__main__':
#app.run(debug=True, threaded=True, port=8000, host='0.0.0.0')
manager.run()
-?,--help # 查看帮助信息
--threaded # 开启多线程
-d # 开启调试模式
-r # 自动加载
-h,--host # 指定主机
-p,--port # 指定端口
python manage.py runserver -d -r -p 8000 -h 0.0.0.0
# 导入类库
from flask import Blueprint
# 创建对象
user = Blueprint('user', __name__)
@user.route('/register/')
def register():
return '欢迎注册'
在manage.py中注册蓝本。
# 蓝本注册,不注册时蓝本处于休眠状态
app.register_blueprint(user, url_prefix='/user')