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‘))

原文地址:https://www.cnblogs.com/gaidy/p/11757355.html

时间: 2024-11-09 15:16:14

1.Flask URL和视图的相关文章

深入学习Flask框架之视图及路由

在前面一讲中我们学习如何创建一个简单的Flask项目,并做了一些简单的分析.接下来在这一节中就主要来讲讲Flask中最核心的内容之一:Werkzeug工具箱.Werkzeug是一个遵循WSGI协议的Python函数库.WSGI协议在前面的文章中也有提到(点我查看).那Werkzeug有什么作用呢?它其实实现了很多底层的东西,如Request.Response和集成URL请求路由等. 一.Werkzeug的组成: 二.routing模块 routing模块的主要目的是负责实现URL解析.不同的UR

Flask即插视图与tornado比较

由于公司使用了Tornado框架和Flask框架,之前一直使用的都是Flask框架,已经对url下面紧跟着视图的写法很固执.刚开始接触Tornado框架,对于其url和视图分开的写法思想上无法转变.今天看了Flask的源码和相关教程看到原来 Flask也可以写出和Tornado类似的代码结构--Flask即插视图. 代码如下: from functools import wraps from flask import Flask, request from flask.views import

网站后端_Python+Flask.0010.FLASK即插视图之自定义视图类及视图修饰?

即插视图; 说明: FLASK的视图灵感来自于DJANGO的基于类而非基于函数的通用视图,主要目的是为了解决多个视图函数之间已经实现的部分,通过类继承的方式继承到其它视图,总之为了一点,就是少写代码,然后通过add_url_rule让我们定义的视图类支持动态插入,也就是所谓的即插视图 深入视图: # 转换前: #!/usr/bin/env python # -*- coding: utf-8 -*- """ # # Authors: limanman # 51CTOBG: h

flask路由和视图和cookie

什么是路由 """ 客户端(例如web浏览器)把请求发送给Web服务器,Web服务器再把请求发送给Flask程序实例. 程序实例需要知道对每个URL请求运行那些代码,所以保存了一个URL到Python函数的映射关系. 处理URL和函数之间关系的程序称之为路由. """ 看个简单完整的的例子 #!/usr/bin/env python # -*- coding:utf-8 -*- from flask import Flask app = Flas

flask 即插视图(Pluggable Views)和endpoint

endpoint经常使用flask的人肯定不会面生.其实我一直没有关注过他是怎么寻址的,直到最近经常食用url_for这个函数才引起了我的注意. url_for看源码感觉实现挺复杂的,我们姑且不在这里纠结看到这一句: def url_for(endpoint, **values): """Generates a URL to the given endpoint with the method provided. 传入的第一个参数是endpoint,url_for函数会将挂在

Flask的路由,视图和相关配置

第一个flask程序 from flask import Flask Flask函数接收一个参数__name__,它会指向程序所在的包 app = Flask(__name__) 装饰器的作用是将路由映射到视图函数 index,在程序运行过程中,程序实例中会使用 url_map 将装饰器路由和视图的对应关系保存起来 @app.route('/') def index(): return 'Hello World' Flask应用程序实例的 run 方法 启动 WEB 服务器 if __name_

Flask框架:视图

1.视图中请求request的属性 request.method request.args request.form request.values request.cookies request.headers request.path request.full_path request.script_root request.url request.base_url request.url_root request.host_url request.host request.files obj

Flask(URL)

url详解 URL是Uniform Resource Locator的简写,统一资源定位符 一个URL由以下几部分组成: scheme://host:port/path/?query-string=xxx#anchor scheme:代表的是访问的协议,一般为http 或者https以及ftp等 host:主机名,域名,比如www.baidu.com port:端口号.当你访问一个网站的时候,浏览器默认使用80端口 path:查找路径. 比如www.jianshu.com/trending/no

flask url转换器,添加另类的url

import urllib from flask import Flask from werkzeug.routing import BaseConverter app = Flask(__name__) class ListConverter(BaseConverter): def __init__(self, url_map, separator="+"): super(ListConverter, self).__init__(url_map) self.separator =