zoukankan      html  css  js  c++  java
  • 1.Flask URL和视图

    1.1.第一个flask程序

    from flask import Flask
    #创建一个Flask对象,传递__name__参数进去
    app = Flask(__name__)
    
    #url与视图映射
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    
    if __name__ == '__main__':
        app.run()   #flask中的一个测试应用服务器

    浏览器访问:http://127.0.0.1:5000/,也可以更改端口号: app.run(port=5001)

    1.2.debug模式

     作用:

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

    四种配置方式

    第一种

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

    第二种

    app.debug = True

    第三种

    app.config.update(DEBUG=True)

    第四种

    新建config.py

    DEBUG = Ture

    然后在主程序总导入引用

    import config
    
    app.config.from_object(config)   
    from flask import Flask
    import config
    #创建一个Flask对象,传递__name__参数进去
    app = Flask(__name__)
    # app.debug = True   #第二种
    # app.config.update(DEBUG=True)  #第三种
    app.config.from_object(config)   #第四种
    
    #url与视图映射
    @app.route('/')
    def hello_world():
        print('helloworkl')
        return 'Hello World!'
    
    if __name__ == '__main__':
        # app.run(debug=True)   #第一种
        app.run()
    四种方式

    1.3.配置文件

    新建config.py

    DEBUG =True

    主程序中两种引用方式

    第一种:

    import config
    
    app.config.from_object(config)  

    第二种

    app.config.from_pyfile('config.py')

    1.4.url传参方式

    普通传参方式

    @app.route('/p/<id>/')
    def article_detail(id):
        return '你访问的文章第%s篇'%id

    指定参数类型

    有以下几种类型:

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

     (1)any

    @app.route('/<any(blog,user):url_path>/<id>')
    def detail(url_path,id):
        if url_path == 'blog':
            return '博客详情%s'%id
        else:
            return '用户详情%s'%id

     

     (2)path

    @app.route('/article/<path:test>/')
    def test_article(test):
        return 'test_article:{}'.format(test)

    获取参数

    from flask import Flask,request
    
    @app.route('/tieba/')
    def tieba():
        wd = request.args.get('wd')
        return '获取的参数的是%s'%wd

    1.5.url_for的使用

    (1)通过视图函数解析出url

    from flask import Flask,url_for
    
    @app.route('/')
    def hello_world():
        return url_for('my_list',page=2)   #url_for里面:第一个是视图函数,第二个是url需要的参数
    
    @app.route('/list/<page>/')
    def my_list(page):
        return 'my_list'

    (2)url_for里面多的参数会当做搜索字符

    @app.route('/')
    def hello_world():
        return url_for('my_list',page=2,count=2)   
    
    @app.route('/list/<page>/')
    def my_list(page):
        return 'my_list'

    1.6.Response

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

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

    实现一个自定义的Response对象

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

    实例:

    from flask import Flask,url_for,Response,jsonify
    
    app = Flask(__name__)
    
    class JsonResponse(Response):
    
        @classmethod
        def force_type(cls, response, environ=None):
            '''
            这个方法只有视图函数返回非字符、非元祖、非Response对象才会调用
            :param response:
            :param environ:
            :return:
            '''
            #把字典转换成json
            if isinstance(response,dict):
                #jsonify将字典转换成json对象,还将该对象包装成了一个Response对象
                response = jsonify(response)
            return super(JsonResponse, cls).force_type(response,environ)
    
    app.response_class = JsonResponse
    
    
    @app.route('/')
    def hello_world():
        return 'Hello world'
    
    @app.route('/list1/')
    def list1():
        return Response('list1')  #合法对象,直接返回
    
    @app.route('/list3/')
    def list3():
        return {'username':'derek','age':18}   #返回的是非字符、非元祖、非Response对象,所以执行force_type方法
    
    if __name__ == '__main__':
    
        app.run(debug=True)
    因为/list3/返回的是字典类型,非字符、非元祖、非Response对象,所以执行force_type方法

    1.7.add_url_rule

    主程序

    from flask import Flask,render_template,url_for
    
    app = Flask(__name__)
    app.config.update({
        'DEBUG':True,
        'TEMPLATES_AUTO_RELOAD':True
    })
    
    @app.route('/',endpoint='index')   
    def hello_world():
        print(url_for("derek_list"))    #通过endpoint找到对应的url   /list/
        return render_template('index.html')
    
    def my_list():
        return "列表页"
    
    #三个参数
    #1.url
    #2.给url起个别名,如果没有指定endpoint,则默认使用视图函数的名字作为endpoint的值
    #3.视图函数
    app.add_url_rule('/list/',endpoint='derek_list',view_func=my_list)
    
    with app.test_request_context():
        print(url_for('index'))    # /
    
    if __name__ == '__main__':
        app.run()

    1.8.类视图

    之前使用的视图都是函数,简称为视图函数,视图也可以基于类来实现,类视图的好处是支持继承,类视图需要通过app.add_url_role(url_rule,view_func)来进行注册,类里面要加装饰器就用:detactors=[]   ,里面可以添加多个装饰器

     (1)标准视图

    • 继承views.VIew
    • 必须实现‘dispatch_request’方法,以后请求过来后,都会执行这个方法,返回值相当于视图函数一样,必须返回'Response'或者子类的对象,或者是字符串,或者是元祖
    • 必须通过app.add_url_role(url_rule,view_func)来做url与视图的映射

    实例

    from flask import Flask,url_for,views
    
    app = Flask(__name__)
    app.config.update({
        'DEBUG':True,
        'TEMPLATES_AUTO_RELOAD':True
    })
    
    class ListView(views.View):
        def dispatch_request(self):
            return "我的列表页"
    
    # 1.ListView.as_view('list')里面必须传个参数‘name’,给view_func起个别名,实际上就是dispatch_request函数
    # 2.endpoint也可以不指定,则默认使用view_func的别名(name参数的值)
    app.add_url_rule('/list/',endpoint='list',view_func=ListView.as_view('list'))
    
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    with app.test_request_context():
        print(url_for('list'))    #/list/
    
    if __name__ == '__main__':
        app.run()

    (2)通过类的继承实现多个视图返回json数据

    from flask import Flask,url_for,views,jsonify
    
    app = Flask(__name__)
    app.config.update({
        'DEBUG':True,
        'TEMPLATES_AUTO_RELOAD':True
    })
    
    #父类,把数据转换成json格式
    class JsonView(views.View):
        def get_data(self):
            raise NotImplementedError
    
        def dispatch_request(self):
            return jsonify(self.get_data())
    
    #子类只需要写get_data方法
    class ListView(JsonView):
        def get_data(self):
            return {"usernmae":'derek','age':18}
    
    app.add_url_rule('/list/',endpoint='list',view_func=ListView.as_view('list'))
    
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    if __name__ == '__main__':
        app.run()

      (3)基于调度方法的类视图 

    class LoginView(views.MethodView):
        def __render(self,error=None):
            return render_template('login.html', error=error)
    
        def get(self,error=None):
            return self.__render()
    
        def post(self):
            username = request.form.get('username')
            password = request.form.get('password')
            if username == 'derek' and password == '123':
                return '登录成功'
            else:
                return self.__render(error='用户名或密码错误')
    
    app.add_url_rule('/login/',view_func=LoginView.as_view('login'))
  • 相关阅读:
    Windows Azure Web Site (19) Azure Web App链接到VSTS
    Windows Azure Virtual Machine (35) Azure VM通过Linked DB,执行SQL Job
    Azure PowerShell (16) 并行开关机Azure ARM VM
    Windows Azure Virtual Network (12) 虚拟网络之间点对点连接VNet Peering
    Azure ARM (21) Azure订阅的两种管理模式
    Windows Azure Platform Introduction (14) 申请海外的Windows Azure账户
    Azure ARM (20) 将非托管磁盘虚拟机(Unmanage Disk),迁移成托管磁盘虚拟机(Manage Disk)
    Azure ARM (19) 将传统的ASM VM迁移到ARM VM (2)
    Azure ARM (18) 将传统的ASM VM迁移到ARM VM (1)
    Azure Automation (6) 执行Azure SQL Job
  • 原文地址:https://www.cnblogs.com/derek1184405959/p/9080124.html
Copyright © 2011-2022 走看看