1、第一个Flask程序

from flask import Flask

app = Flask(__name__)

# @app.route:是一个装饰器
# @app.route('/')就是将url中的/映射到hello_world这个视图函数上面
# 以后你访问我这个网站的/目录的时候,会执行hello_world这个函数,然后将这个函数的返回值
# 返回给浏览器。
@app.route('/')
def hello_world():
    return 'Hello World'

# www.baidu.com/list/
@app.route('/list/')
def my_list():
    return 'my list'

# 如果这个文件是作为一个主文件运行,那么就执行app.run()方法
# 也就是启动这个网站
if __name__ == '__main__':
    app.run(port=8000)

浏览器访问:http://127.0.0.1:5000

2、debug模式

为什么需要开启DEBUG模式?

作用:

  • 如果抛出异常,在浏览器中可以看到具体错误信息
  • 在修改代码后,只要按“ctrl+s”,就会自动重启项目,不用手动重新运行。

配置debug的四种方式:

1、

if __name__ == '__main__':
    app.run(debug=True)

2、

app.debug=True

3、通过配置文件

from config import config

app.config.from_object(config)

4、通过配置参数

app.config.update(DEBUG=True)

3、配置文件

有两种方式

新建config.py

DEBUG=True

1、

import config
app.config.form_object(config)

2、

app.config.pyfile('config.py')

4、URL传参方式

1、传递参数

传递参数的语法为:'/<参数名>/'

@app.route('/p/<article_id>')
def article_detail(article_id):
    return rticle_id

可以限制参数传递的类型:

@app.route('/p/<float:article_id>')
def article_detail(article_id):
    return  article_id

还可以限制限制请求的类型:

@app.route('/p/<float:article_id>',methods=['POST','GET'])
def article_detail(article_id):
    return  article_id

有以下几种类型:

  • string:默认的数据类型
  • int:接受整形
  • float:浮点型
  • path:和string的类似,但是接受斜杠
  • any:可以指定多个路径
  • uuid:只接受uuid字符串

any 数据类型的使用:

@app.route('/<any(blog,user):url_path>/<id>')
def detail(url_path,id):
    if url_path == 'blog':
        return id
    else:
        return id

2、接受用户传递的参数

from flask import Flask,request

@app.router('\d')
def test():
    params=request.args.get('data')  #获取用户提交的数据
    return params

5、url_for的使用

flask 多次request 数据共享_URL

url_for的使用:

url_for 的第一个参数是视图函数的名字,接下来的参数会传递给URL,如果url接收的参数已经够了,剩下的则会作为查询参数添加到url中。

@app.route('/test2/')
def url_for_test():
    return url_for('test', lalala='666') #lalala作为参数加在?后面


@app.route('/test/')
def test():
    return 'rest'

flask 多次request 数据共享_视图_02

为什么使用`url_for`

类似于Django的路由中的name=‘’,方便以后的更改路由。

当路由更改后,但是函数名没有更改,使用url_for很方便。不用去替换url。

6、自定义URL类型

传递的ur类型l除了有4中介绍的几种外,还可以自定义url类型:
1、实现一个类,继承自BaseConverter

2、在自定义的类中,重写regex

3、将自定义的类,映射到app.url_map.converters

class TelephoneConveter(BaseConverter):
    regex = r'1[85734]\d{9}'

app.url_map.converters['tel'] = TelephoneConveter


#使用自定义的url类型
@app.route('/telephone/<tel:my_tel>/')
def my_tel(my_tel):
    return '您的手机号码是:%s' % my_tel

flask 多次request 数据共享_Flask_03

to_python的使用:

作用:这个方法的返回值,将会传递到视图函数中作为参数

to_url的使用:

这个方法的返回值,在调用url_for函数的时候生成复合要求的URL形式。

class TestConverter(BaseConverter):
    def to_python(self, value):
        return value + 'test' #在url后加上‘test’

    def to_url(self, value):
        return value[:2]    #使用url_for时,取前两个


app.url_map.converters['test'] = TestConverter


@app.route('/<test:sss>/')
def user(sss):
    return sss

 

flask 多次request 数据共享_自定义_04

 

7.重定向

重定向分为永久性重定向和暂时性重定向

from flask import Flask,request,redirect,url_for

@app.route('/login/')
def login():
    return '这是登录页面'

@app.route('/profile/')
def profile():
    if request.args.get('name'):
        return '个人中心页面'
    else:
        return redirect(url_for('login')) #没有登录就重定向到登录页面

8、Response

 视图函数中可以返回的类型

  • 可以返回字符串,返回的字符串其实底层将这个字符串包装成了一个‘Response’对象
  • 可以返回元组,形式(响应体,状态码,头部信息),返回的元组其实底层将这个字符串包装成了一个‘Response’对象
  • 可以返回Response及其子类

实现一个自定义的Response对象

  • 继承自、‘Response’类
  • 实现方法‘force_type’
  • 指定‘app.response_class’为你自定义的‘Response’对象
  • 如果视图函数返回的数据,不是字符串,也不是元组,也不是Response对象,那么就会将返回值传给‘force_type’,然后将‘force_type’的返回值返回给前端 
# 将视图函数中返回的字典,转换成json对象,然后返回
class JSONResponse(Response):

    @classmethod
    def force_type(cls, response, environ=None):
        """
        这个方法只有视图函数返回非字符、非元组、非Response对象才会调用
        response:视图函数的返回值
        """
        if isinstance(response,dict):
            # jsonify除了将字典转换成json对象,还将改对象包装成了一个Response对象
            response = jsonify(response)
        return super(JSONResponse, cls).force_type(response,environ)

app.response_class = JSONResponse



@app.route('/list/')
def list():
    return {'username':'ming','age':16}

list返回的是字典类型,多以会走自定义的Response类,转换成json格式