flask学习

来源:互联网 发布:贵阳浪人网络 编辑:程序博客网 时间:2024/06/05 01:10

路由的基础知识:静态路由和动态路由

静态路由

@app.route('/service')def services():    return 'Service'

动态路由:变量名和参数名要对应。

@app.route('/user/<username>')def user(username):    return 'username %s' % username

类型匹配(flask中总共提供三种转换器:int(整型) float(浮点型) path(路径,字符串))

@app.route('/user/<int:userid>')def userid(userid):    return 'username %d' % userid

正则表达式的路由验证实现

from werkzeug.routing import BaseConverterclass RegexConverter(BaseConverter):    def __init__(self, url_map, *items):        super(RegexConverter,self).__init__(url_map)        self.regex=items[0]app = Flask(__name__)#将转换器注册到url中app.url_map.converters['regex'] = RegexConvertermanager = Manager(app)#测试自定义正则表达式路由@app.route('/user/<regex("[a-z]{3}"):userid>')def myregex(userid):    return 'user is %s' % userid

一个视图函数对外提供多个访问的URL

@app.route('/user/<regex("[a-z]{3}"):userid>')@app.route('/user/<userid>')def myregex(userid):    return 'user is %s' % userid

控制访问URL的方式:post 、get、put、delete、head、options

POST:

浏览器告诉服务器:想在url上发布新信息并且服务器必须确保数据已经存储且仅仅存储一次这是html表单通常发送数据的方法。

GET:

浏览器告知服务器:只获取页面上的数据并且发给我

这是做常用的方法

PUT:

做更新:这种方式可以在浏览器和服务器之间可以安全的情况下进行第二次接收请求,而不破坏其他东西。POST只做一次所以post不能替代。

DELETE:

删除给定位置的信息

HEAD:头消息

OPTIONS:

给客户端提供一个敏捷的途径来弄清这个URL支持哪些HTTP方法

从flask0.6开始实现了自定义处理。

from flask import render_template@app.route('/login',methods=['GET','POST'])def login():    return render_template('login.html',method=request.method)

flask处理请求的生命周期

1、从浏览器发送一个请求到服务端,flask接收这个请求后、这个请求将会由路由系统接收、

2、在路由系统中可以挂入一些钩子(在进入视图函数之前进行一些预处理),然后产生一个request对象

3、从request对象里面我们可以获取一些变量form和cookie及其参数args传入到我们的视图函数中

4、进一步的业务处理

5、视图函数处理完成后将结果返回给页面(一般我们不用直接产生一个response对象自行返回,而是通过redirect、render_teplate这个方法直接输出给flask即可。)通过make_response对象可一直接产生response对象,可以使用response对输出到浏览器的请求做更细致化的一些输出。

request上下文对象:

from flask import Flaskfrom flask import requestfrom flask import render_template@app.route('/login',methods=['GET','POST'])def login():    if request.method == 'POST':        username = request.form['username']        password = request.form['password']        print username        print password    else:        username = request.args['username']        password = request.args['password']    # python变量的作用范围问题    print username    print password        return render_template('login.html',method=request.method)
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>登陆</title></head><body>    <h1>HTTP方法{{ method }}</h1>    <form method="post">        <div>            <input type="text" name="username" placeholder="用户名"/>        </div>        <div>            <input type="password" name="password" placeholder="密码"/>        </div>        <input type="submit"/>    </form></body></html>

文件上传

from flask import Flaskfrom flask import requestfrom flask import render_templatefrom os import pathfrom werkzeug.utils import secure_filenamefrom flask import redirect, url_for#文件上传@app.route('/upload',methods=['POST','GET'])def upload():    if request.method == 'POST':        f = request.files['file']        basepath = path.abspath(path.dirname(__file__))        upload_path = path.join(basepath,'static\\uploads')        f.save(upload_path, secure_filename(f.filename))        return redirect(url_for('upload'))    return render_template('upload.html')

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>文件上传</title></head><body>    <form action="" method="post" enctype="multipart/form-data">        <p>            <input type="file" name="file"/>            <input type="submit" name="上传"/>        </p>    </form></body></html>

自动加载代码并推送显示到浏览器

from livereload import Server# 自动加载代码并推送显示到浏览器   @manager.commanddef dev():    live_server = Server(app.wsgi_app)    live_server.watch('**/*.*')    live_server.serve(open_url=True)

异常处理

#定义统一错误页面@app.errorhandler(404)def page_not_found(error):    return render_template('404.html'), 404

cookies的应用

from flask import make_responsefrom flask import abort# 利用response产生cooike,包装模板@app.route('/')def hello():    abort(404)    response = make_response(render_template('index.html', title = '<h1>Hello World!</h1>'))    response.set_cookie('username', 'renbo')    return response


原创粉丝点击