python 初步认识Flask
1.简介 flask
问题一: 访问百度的流程?
a. 客户端: 发送请求报文, 请求行, 请求头, 请求体
b.服务端: 解析请求的报文, 解析域名, 进行路由匹配分发找到对应的视图函数, 打包, 会送给客户端, 响应头, 响应体, 响应
c.客户端: 收到了响应报文, 进行解析, 显示到浏览器中 2.框架:
定义: 封装一些方法函数的代码
框架的核心: jinja2(模板引擎), werkzeug(路由) 3.虚拟环境
思考: 为什么搭建虚拟环境?
实际开发中, 为了不影响两个项目的正常运行, 所以使用虚拟环境. 如何创建虚拟环境?
mkvirtualenv 虚拟环境名称
进入虚拟环境?
workon 虚拟环境名称
退出虚拟环境
deactivate 4.第一个程序helloworld
实现步骤
a. 导入模块flask
b.创建实例对象
c.视图函数
d.绑定路由, 与视图函数建立联系
e.调用run方法 demo1 hello world
from flask import Flask
# 导入该模块
app = Flask(__name__,
static_path = "/static", # 静态访问路径
static_url_path = "/static", # 静态访问路径
static_folder = "", # 静态访问文件
template_folder = "" # 模板访问的文件夹
)
# 创建实例对象
@app.route("/")
def index():
return " hello world "
# 定义视图函数, 与路由进行关联
if __name__ = "__main__":
app.run()
# 调用run方法, 运行函数 加载调试的三种方式:
记住在实例对象的下面进行配置
# 1. 通过对象来配置
class Config(object):
debug = True
# 进行关联
实例对象.config.form_object(Config)
# 2. 通过文件来配置
实例对象.config.from_pyfile("config.ini")
# 3. 通过环境变量来配置
实例对象.config.from_envvar("ENVCONFIG")
一些常用的可以直接在实例对象后创建:
实例对象.debug = True
实例对象.config["DEBUG"] = True
注意: 调用run方法是可以传递参数
实例对象.run(host, post, debug) 5.怎样设置路由?
demo1
# 实现路由, 指定路径为/index
@app.route("/index")
def index():
return index
装饰器传参
# 传参实例
注意: 路由传递参数时, 默认会传递string类型, 也可以指定其他类型
@app.route("/user/<user_id>")
def user_info():
return "%s" % user_id
思考: 如何指定一个请求方式?
通过methods来进行指定请求方式, 默认是get请求
@app.route("/index", methods=["POST","GET"])
def index():
return "index"
扩展:
put: 修改服务器数据
pash: 修改服务器数据
两个之间的区别: put其中一个修改之后全部发送, pash就是传输修改的内容
delete: 删除服务器数据
option: 只需要返回HEAD, 不返回header 6.视图常用逻辑
a.返回json数据
b.重定向: url_for
注意: 如果返回的是一个固定的网址, 可以不适应url_for
c.自定义状态码
#demo
from flask import Flask, jsonify
from flask import json
from flask import redirect
from flask import request
from flask import url_for
app = Flask(__name__)
@app.route("/")
def index():
return "index"
@app.route("/demo1")
def demo1():
return "demo1"
# 给路由添加参数,格式就是 <参数名>
# 并且视图函数需要接收这个参数
@app.route("/user/<int:user_id>")
def demo2(user_id):
return "demo2 %s" % user_id
@app.route("/demo3", methods=["POST","GET"])
def demo3():
return "demo3 %s " % request.method
@app.route("/json")
def demo4():
json_dict = {
"name": "laowang",
"age" : 18
}
# 使用JSON.dumps将字典转成JSON字符串
# result = json.dumps(json_dict)
# return result
# 使用JSON将字符串转成JSON.dumps字典
# result = json.loads(json_dict)
# return result
# jsonify会指定响应内容的数据格式(告诉客户端我返回给你的数据格式是什么)
return jsonify(json_dict)
@app.route('/redirect')
def demo5():
# 重定向回到自己的页面
# url_for:取到指定视图函数所对应的路由URL,并且可以携带参数
# return redirect(url_for('demo2',user_id=123))
# 重定向到百度, 这个时候就不用书写url_for
return redirect('http://www.baidu.com')
@app.route('/demo6')
def demo6():
return "demo6", 3456 # 3456
if __name__ == '__main__':
app.run(port=1245, debug=True)
7.正则匹配路由
代码实现步骤
#导入werkzeug.routing中的BaseConverter
from werkzeug.routing import BaseConverter
from flask import Flask
#自定义转换器
# 自定义正则转换器
class RegexConverter(BaseConverter):
def __init__(self, url_map, *args):
super(RegexConverter, self).__init__(url_map)
# 将接受的第1个参数当作匹配规则进行保存
self.regex = args[0]
# 添加转换器到默认的转换器字典中,并指定转换器使用时名字为: re
app = Flask(__name__)
# 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: re
app.url_map.converters['re'] = RegexConverter
#使用转换器去实现自定义匹配规则
#当前此处定义的规则是:3位数字
@app.route('/user/<re("[0-9]{3}"):user_id>')
def user_info(user_id):
return "user_id 为 %s" % user_id to_python 和 to_url
class ListConverter(BaseConverter):
# 自己定义转换器
regex = "(\\d+,?)+\\d$"
def to_python(self, value):
"""当屁配到参数, 对参数进一步处理, 返回给试图函数"""
return value.split(",")
def to_url(self, value):
"""使用url_for的时候,对视图函数传的参数进行处理,处理完毕之后以便能够进行路由匹配"""
result = ','.join(str(v) for v in value)
return result 系统自带的转换器6种
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
} 8.异常捕获
a. 主动抛出异常 abort(状态码)
b. errorhandler装饰器进行装饰
demo
from flask import Flask
from flask import abort
app = Flask(__name__)
@app.route('/')
def index():
return 'index'
@app.route('/demo1')
def demo1():
# abort(404) # 注意报错码此时应该注意传入参数
a = 0
b = b / a
return "demo1"
@app.errorhandler(404)
def page_not_found(error):
return "亲, 页面不见了"
@app.errorhandler(ZeroDivisionError)
def zero_division_error(error):
# 必须要传入一个参数
return '除数不能为0'
if __name__ == '__main__':
app.run(port=1111, debug=True) 9.钩子函数
demo1
from flask import Flask
app = Flask(__name__)
@app.before_first_request
def before_first_request(response):
"""第一次会访问该函数并且函数里面接受一个参数:响应,还需要将响应进行返回"""
print('before_first_request')
return response
@app.before_request
def before_request():
"""每次请求之前都会调用"""
print('before_request')
@app.teardown_request
def teardown_request(error):
"""在请求之后会执行,如果请求的函数报有异常,会把具体异常传入到此函数"""
print("teardown_request")
@app.route('/')
def index():
return 'index'
if __name__ == '__main__':
app.run(port=1456)
python 初步认识Flask的更多相关文章
- Python中使用Flask、MongoDB搭建简易图片服务器
主要介绍了Python中使用Flask.MongoDB搭建简易图片服务器,本文是一个详细完整的教程,需要的朋友可以参考下 1.前期准备 通过 pip 或 easy_install 安装了 pymong ...
- python中使用flask时遇到的markupsafe._compat包缺失的问题与解决
环境:windows7 + python3.6.0 在尝试使用python的flask时,按照flask的tutorial操作,装好flask.venv后,对tutorial中的hello.py进行运 ...
- python操作三大主流数据库(4)python操作mysql④python服务端flask和前端bootstrap框架结合实现新闻展示
python操作mysql④python服务端flask和前端bootstrap框架结合实现新闻展示 参考文档http://flask.pocoo.org/docs/0.11/http://flask ...
- python初步要点II
[python初步要点II] 1.is & is not 操作符用于测试2个对象是否指向同一个对象,即 id(a) == id(b). 2.整形和字符串对象是不可变对象,python会高效地缓 ...
- python初步要点
[python初步要点] #! 用于告诉操作系统去哪里找Python解释器为运行您的程序. 1.print 的输出有以下2种形式,""%()的形式类似于C的printf. 要注意逗 ...
- Flask初学者:Python虚拟环境,Flask安装,helloworld,run方法
一.Python虚拟环境: 作用:使Python框架的不同版本可以在同一台电脑上运行.如果在电脑上全局(C盘或者其他目录)安装Flask(或其他Python框架),当你使用其他版本的Flask(比如有 ...
- python初步编写用户登录
python初步编写用户登录 python编写用户登录 用python写一个脚本,使得这个脚本在执行后,可以产生如下的效果: 1.用户的账号为:root 密码为:westos 2.用户账号和密码均输 ...
- python web框架Flask——csrf攻击
CSRF是什么? (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click ...
- 【简说Python WEB】Flask应用的文件结构
目录 [简说Python WEB]Flask应用的文件结构 1.文件结构的目录 2.配置程序--config.py 3.app应用包 4.剥离出来的email.py 5.蓝本(BLueprint)的应 ...
随机推荐
- 老板说你的UI设计的不高级?你肯定没用这7个技巧...
对于每个网页设计师而言,在设计过程中总会碰到需要作出设计决策的时候.也许你的公司并没有全职设计师,而需求上则要求设计出全新的UI:又或者你正在制作一个你自己的个人项目,而你希望它比 Bootstrap ...
- [Selenium]Eclipse hangs at 57% in debug mode with TestNG tests
案例1: I am very thankful to saish and cbeust for the solution. I went through the similar issue with ...
- Windows10 Virtualization Technology虚拟化技术功能
为什么要开启VT功能,做机器学习环境搭建.运用Docker容器等等,所以首先要确认一下机器是否已经开启了VT技术功能,以此记录一下经历而已. VT是什么?为什么要开启VT?VT是一种虚拟化技术,可以扩 ...
- 2018.10.09 NOIP模拟 好数(双向搜索)
传送门 直接双向搜索出两边可行解,然后把两边的可行解合并起来得出答案就行了. 注意合并的时候可以利用排序和单调性优化时间复杂度. 直接枚举合并是O(siza∗sizb)O(siza*sizb)O(si ...
- 2018.09.05 bzoj1010: [HNOI2008]玩具装箱toy(斜率优化dp)
传送门 一道经典的斜率优化dp. 推式子ing... 令f[i]表示装前i个玩具的最优代价. 然后用老套路. 我们只考虑把第j+1" role="presentation" ...
- 2018.08.28 洛谷P4556 [Vani有约会]雨天的尾巴(树上差分+线段树合并)
传送门 要求维护每个点上出现次数最多的颜色. 对于每次修改,我们用树上差分的思想,然后线段树合并统计答案就行了. 注意颜色很大需要离散化. 代码: #include<bits/stdc++.h& ...
- Django入门与实践-第11章:URL 分发(完结)
http://127.0.0.1:8000http://127.0.0.1:8000/boards/1/http://127.0.0.1:8000/boards/2/http://127.0.0.1: ...
- 解决Error creating bean with name 'huayuanjingguanDaoimp' defined in file [D:\apache-tomcat-7.0.52\webapps\landscapings\WEB-INF\classes\com\itheima\landscaping\dao\imp\huayuanjingguanDaoimp.class]: Invo
问题描述: 10:23:13,585 ERROR ContextLoader:307 - Context initialization failedorg.springframework.beans. ...
- Codeforces735B Urbanization 2016-12-13 11:58 114人阅读 评论(0) 收藏
B. Urbanization time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- 从问题域看hadoop的各种技术
近些年来Hadoop生态系统发展迅猛,它本身包含的软件越来越多,同时带动了周边系统的繁荣发展.尤其是在分布式计算这一领域,系统繁多纷杂,时不时冒出一个系统,号称自己比MapReduce或者Hive高效 ...