精华内容
下载资源
问答
  • 主要目的是让你可以对已实现的部分进行替换,并且这个方式可以定制即插视图。 1. 基本原则 想象你有一个从数据库载入一个对象列表并渲染到视图的函数: @app.route('/users/') def show_users(page): users = User...

    0.7 新版功能。

    Flask 0.7 引入了即插视图,灵感来自 Django 的基于类而不是函数的通用视图。其主要目的是让你可以对已实现的部分进行替换,并且这个方式可以定制即插视图。

    1. 基本原则

    想象你有一个从数据库载入一个对象列表并渲染到视图的函数:

    @app.route('/users/')
    def show_users(page):
    	users = User.query.all()
    	return render_template('user.html', users=users)
    

    这是简单而灵活的,但如果你想要用一种通用的,同样可以适应其他模型和模板的方式来提供这个视图,你会需要更大的灵活性。这就是基于类的即插视图所做到的。第一步,把它转换为基于类的视图,你要这样做:

    from flask.views import View
    
    class ShowUsers(View):
    	def patch_request(self):
    		users = User.query.all()
    		return render_template('user.html', object=users)
    
    app.add_url_rule('/users/', ShowUsers.as_view('show_users'))
    

    如你所见,你需要做的是创建一个 flask.views.View 的子类,并且实现 dispatch_request()。然后我们需要用类方法 as_view() 把这个类转换到一个实际的视图函数。你传给这个函数的字符串是视图之后的最后名称。但是用它自己实现的方法不够有效,所以我们稍微重构一下代码:

    from flask.views import View
    
    class ListView(View):
    	def get_template_name(self):
    		raise NotImplementedError()
    
    	def render_template(self, context):
    		return render_template(self.get_template_name(), **context)
    
    	def dispatch_request(self):
    		context = {'objects': self.get_objects()}
    		return self.render_template(context)
    
    class UserView(ListView):
    	def get_template_name(self):
    		return 'user.html'
    
    	def get_objects(self):
    		return User.query.all()
    

    这当然不是那么有助于一个小例子,但是对于解释基本原则已经很有用了。当你有一个基于类的视图,那么问题来了,self 指向什么。它工作的方式是,无论·何时请求被调度,会创建这个类的一个新实例,并且 dispatch_request() 方法会以 URL 规则为参数调用,这个类本身会用传递到 as_view() 函数的参数来实例化。比如,你可以像这样写一个类:

    class RenderTemplateView(View):
    	def __init__(self, template_name):
    		self.template_name = template_name
    
    	def dispatch_request(self):
    		return render_template(self.template_name)
    

    然后你可以这样注册它:

    app.add_url_rule('/about', view_func=RenderTemplateView.as_view(
                    'about_page', template_name='about.html'))
    

    2. 方法提示

    即插视图可以像常规函数一样用 route() 或更好的 add_url_rule() 附加到应用中。然而当你附加它时,你必须提供 HTTP 方法的名称。为了将这个信息加入到类中,你可以提供 methods 属性来承载它:

    class MyView(View):
    	methods = ['GET', 'POST']
    	def dispatch_request(self):
    		if request.method == 'POST':
    			...
    		...
    
    app.add_url_rule('/myview', view_func=MyView.as_view('myview'))
    

    3. 基于调度的方法

    对每个 HTTP 方法执行不同的函数,对 RESTful API 非常有用。你可以通过 flask.views.MethodView 容易地实现。每个 HTTP 方法映射到同名函数(只有名称为小写的):

    from flask.views import MethodView
    
    class UserAPI(MethodView):
    	def get(self):
    		users = User.query.all()
    		...
    
    	def post(self):
    		user = User.from_form_data(request.data)
    		...
    
    app.add_url_rule('/users/', view_func=UserAPI.as_view('users'))
    

    如此,你可以不提供 methods 属性。它会自动的按照类中定义的方法来设置。

    4. 装饰视图

    既然视图类自己不是加入到路由系统的视图函数,那么装饰视图类并没有多大意义。相反的,你可以手动装饰 as_view() 的返回值:

    def user_required(f):
    	"""Checks whether user is logged in or raises error 401."""
    	def decorator(*args, **kwargs):
    		if not g.user:
    			abort(401)
    		return f(*args, **kwargs)
    	return decorator
    
    view = user_required(UserAPI.as_view('users'))
    app.add_url_rule('/users/', view_func=view)
    

    从 Flask 0.8 开始,你也有一种在类声明中设定一个装饰器列表的方法:

    class UserAPI(MethodView):
    	decorators = [user_required]
    

    因为从调用者的视角来看 self是不明确的,所以你不能在单独的视图方法上使用常规的视图装饰器,请记住这些。

    5. 用于API的方法视图

    Web API 的工作通常与 HTTP 动词紧密相关,所以这使得实现这样一个基于 MethodView 类的 API 很有意义。也就是说,你会注意到大多数时候,API 需要不同的 URL 规则来访问相同的方法视图。譬如,想象一种情况,你在 web 上暴露一个用户对象:

    URL HTTP 方法 描述
    /users/ GET 获得全部用户的列表
    /users/ POST 创建一个新用户
    /users/<id> GET 显示某个用户
    /users/<id> PUT 更新某个用户
    /users/<id> DELETE 删除某个用户

    那么,你会想用 MethodView 做什么相同的视图?诀窍是利用你可以对提供多个规则的事实。

    让我们假设这时视图看起来是这个样子:

    class UserAPI(MethodView):
    	def get(self, user_id):
    		if user_id is None:
    			# return a list of users
    			pass
    		else:
    			# expose a single user
    			pass
    	
    	def post(self):
    		# create a new user
    		pass
    
    	def delete(self, user_id):
    		# delete a single user
    		pass
    
    	def put(self, user_id):
    		# update a single user
    		pass
    

    如此,我们怎样把它挂在到路由系统中?添加两条规则,并且为每条规则显式地指出 HTTP 方法:

    user_view = UserAPI.as_view('user_api')
    app.add_url_rule('/users/', defaults={'user_id': None},
    				 view_func=user_view, methods=['GET'])
    app.add_url_rule('/users/', view_func=user_view, methods=['POST'])
    app.add_url_rule('/users/<int:user_id>', view_func=user_view,
    				 methods=['GET', 'PUT', 'DELETE'])
    

    如果你有许多看起来类似地 API,你可以重构上述的注册代码:

    def register_api(view, endpoint, url, pk='id', pk_type='int'):
    	view_func = view.as_view(endpoint)
    	app.add_url_rule(url, defaults={pk: None}, view_func=view_func,
    					 methods=['POST'])
    	app.add_url_rule(url, view_func=view_func, methods=['POST'])
    	app.add_url_rule('%s<%s:%s>' % (url, pk_type, pk), 
    			view_func=view_func,
    			methods=['GET', 'PUT', 'DELETE'])
    
    register_api(UserAPI, 'user_api', '/users/', pk='user_id')
    
    展开全文
  • 物化视图其实就是一张数据表,引入的目的是为了提高数据仓库查询性能,以空间换取时间一种手段。 物化视图主要可以分为三类:聚合型,关联型和嵌套型。更新方式可以分为增量,全量。而enable query rewr...

    七、物化视图

    物化视图其实就是一张数据表,引入的目的是为了提高数据仓库的查询性能,以空间换取时间的一种手段。

    物化视图主要可以分为三类:聚合型,关联型和嵌套型。更新方式可以分为增量,全量。而enable query rewrite功能,可以保持应用语句不变的情况下,自动改变执行语句使用物化视图,极大提高了可用性。

    CREATE MATERIALIZED VIEW product_sales_mv

    PCTFREE 0 TABLESPACE demo

    STORAGE (INITIAL 8k NEXT 8k PCTINCREASE 0)

    BUILD IMMEDIATE

    REFRESH FAST

    ENABLE QUERY REWRITE

    AS SELECT p.prod_name, SUM(s.amount_sold) AS dollar_sales,

    COUNT(*) AS cnt, COUNT(s.amount_sold) AS cnt_amt

    FROM sales s, products p

    WHERE s.prod_id = p.prod_id GROUP BY p.prod_name;

    聚合型需要注意添加count(*)字段,否则在增量更新时只有insert才生效,updatedelete均无效。物化视图日志是记录原表的变化情况的一张表,如果需要使用增量更新则必须创建物化视图日志。

    另外一个需要关注的是DBMS_ADVISOR.TUNE_MVIEW,这个存储过程是10g的新功能,作用是优化和改写你的创建语句,如果需要物化视图日志也会一并列出在USER_TUNE_MVIEW。但在某些版本中使用会有一定的问题。

    select distinct a, b from tab

     

    物化视图大量使用在分布数据库中,因此dblink也自然可能成为了考点之一了。

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13605188/viewspace-678639/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/13605188/viewspace-678639/

    展开全文
  • 可视化编程跳转 1:未使用连线方式 引入要跳转的视图对象 1)使用系统storyBoard 首先要给到storyBoard的目的地页面设置标识符,获取到要跳转页面对象。然后在使用pus方式使用导航栏跳转。 2:使用自定义...

    可视化编程的跳转
     1:未使用连线的方式
        引入要跳转的视图对象
         1)使用系统的storyBoard
        首先要给到storyBoard的目的地页面设置标识符,获取到要跳转的页面对象。然后在使用pus的方式使用导航栏跳转。
         2:使用自定义的
        首先使用UIStoryBoard创建一个根据自定义名字获取到对应的storyBoard
        根据获得的storyBoard获取到相对应标识符的要跳转到的目的地对象
        使用pus进行跳转
    2:使用连线的方式
       三种方法
       1)pus的方法,按住ctrl右键鼠标原始图拖拽连线到要跳转的对象视图,根据弹出的页面选中pus的方式即可
       2)模态的方式 按住ctrl右键鼠标原始图拖拽连线到要跳转的对象视图,根据弹出的页面选中模态的方式即可
       3)自定义的方法 按住ctrl右键鼠标原始图拖拽连线到要跳转的对象视图,根据弹出的页面选controller的方式即可
           使用自定义的方式需要设置一些方法
            (1):连线以后,穿件一个继承与UIStoryboardSegue的类,调用系统的方法perform。
            (2):perform方法里面要写UIView的动画效果 这里要获取两个视图,分别是起始的视图的UIView和要跳转到的目的地的视图UIView。引入对应的类,然后使用系统的属性获取到对应的对象。
            (3):使用对应的方法UIView的动画跳转方法进行跳转,这里还是需要用到pus的方法,但是动画效果可以关闭。
     传值
       这里的传值是结合自定义跳转的方式来设置的
       在要传的位置写一个方法prepareForSegue:这个方法是跳转会调用的方法
       方法里面获取到目的地的视图控制器,当你的视图控制器里面的自定义的跳转过多的时候要根据给其跳转标识符,来if判断的方式来执行传值的操作。

    http://user.qzone.qq.com/173542387/blog/1457110498

    转载于:https://my.oschina.net/rdqblogs/blog/684927

    展开全文
  • MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model)。 Vue.js 是一个提供了 MVVM 风格双向数据绑定 Javascript 库,专注于View 层。 ViewModel负责连接 View 和 Model,保证视图和数据一致性...

    1.介绍

    MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开 。

    MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model)。

    Vue.js 是一个提供了 MVVM 风格的双向数据绑定的 Javascript 库,专注于View 层。

    ViewModel负责连接 View 和 Model,保证视图和数据的一致性

     

    2.快速入门

    1.在页面中引入vue的js文件

    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="js/vuejs-2.5.16.js"></script>
    </head>

    2.在页面中定义一个根节点。一般就是div

    <body>
    <!--使用vue必须要有一个根结点  -->
    <div id="root">
            <input type="text" v-model="message"  @keydown.enter="myKeydown()"> <br>
            <p>直接把vue数据在页面中展示</p>
            <h4>{{message}}</h4>
            <br>
            <button  @click="myClick()">切换</button>
    </div>
    </body>

    3.在js代码中初始化一个vue对象,基于上面的根节点初始化

    <script>
    
        //初始化Vue对象
        new Vue({
            //初始化vue对象的根节点 只要在root内容都可以使用vue内容
            el:"#root",
            //定义页面使用的模型数据js变量
            data:{
                message:"hello vue!"
            },
            methods:{
                myClick:function () {
                    alert("被点了")
                    this.message = "abcd";
                },
                myKeydown:function () { /*按下键盘是按的哪一个键*/
                        alert("按了回车");
                        alert(this.message);
                }
            }
        });
    </script>
    

     

     3.编写小案例加深印象

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body >  <!--不能把body当作根标签-->
    <div id="app">
        <!--阻止事件默认行为-->
        <a href="http://www.baidu.com" @click.prevent="aClick($event)">点击</a>
        <hr>
        <div id="box1" style="width: 300px; height: 300px;background: red;" @click="click1()">
            <!--阻止事件冒泡-->
            <div id="box2" style="width: 100px; height: 100px;background: blue;" @click.prevent.stop="click2()"></div>
        </div>
    </div>
    
    </body>
    <script src="js/vuejs-2.5.16.js"></script>
    <script>
        new Vue({
           el:"#app",
           methods:{
               aClick:function (event) {  /*默认行为*/
                   alert("aa");
               },
               click1:function () {
                   alert("box1")
               },
               click2:function () {
                   alert("box2")
               }
           }
        });
    
    
    </script>
    </html>

    <!DOCTYPE html>
    <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body >  <!--不能把body当作根标签-->
    <div id="app">
        <!--插值语法-->
        <p>{{num}}</p>
        <p>{{num+100}}</p>
        <p>{{num>100?'真':'假'}}</p>
        <p>{{person.name}}:{{person.age}}</p>
        {{content}}  <!--内容是文本 写的html不会解析-->
        <div v-text="content"></div>
        <hr>
        <div v-html="content"></div>
        <!--单向绑定-->
        <input type="text" v-bind:value="message"> {{message}} <br>
        <!--双向绑定-->
        <input type="text" v-model="message"> {{message}}
    </div>
    
    </body>
    <script src="js/vuejs-2.5.16.js"></script>
    <script>
        new Vue({
            el:"#app",
            data:{
                content:'<h1>abc</h1>',
                num:200,
                person:{name:'gxq',age:30},
                message:"hello"
            },
            methods:{
    
           }
        });
    
    
    </script>
    </html>

     

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    
        <style type="text/css">
            #box1 { width: 300px; height: 300px; background: blueviolet; }
            #box2 { width: 200px; height: 200px; background: aquamarine; }
            #box3 { width: 100px; height: 100px; background: tomato; }
            div { overflow: hidden; margin: 50px auto; }
        </style>
    
    </head>
    
    <body>
        <div id="box1">
            <div id="box2">
                <div id="box3"></div>
            </div>
        </div>
        <script>
            function sayBox3() {
                console.log('你点了最里面的box');
            }
            function sayBox2() {
                console.log('你点了最中间的box');
            }
            function sayBox1() {
                console.log('你点了最外面的box');
            }
            // 事件监听,第三个参数是布尔值,默认false,false是事件冒泡,true是事件捕获
            document.getElementById('box3').addEventListener('click', sayBox3, true);
            document.getElementById('box2').addEventListener('click', sayBox2, true);
            document.getElementById('box1').addEventListener('click', sayBox1, true);
    
        </script>
    </body>
    </html>

     

     

    展开全文
  • 目的主要是为支持大屏幕设备上更加动态和灵活 UI 设计,比如平板电脑。由于平板电脑比手机拥有更大屏幕显示,所以平板电脑就会有足够空间来进行组件交互和整合。Fragments 设计不需要你来管理视图显示...
  • flask中蓝图最主要的目的还是增强代码可读性,降低其耦合度,比如做一个项目,代码业务逻辑量很大,这是可以引入蓝图进行处理! 官方点说:蓝图就是一个**存储操作路由映射方法容器**,主要用来实现客户端...
  • 对于flask蓝图理解

    千次阅读 2018-07-03 15:49:03
    答:flask中蓝图最主要的目的还是增强代码可读性,降低其耦合度,比如做一个项目,代码业务逻辑量很大,这是可以引入蓝图进行处理蓝图就是一个**存储操作路由映射方法容器**,主要用来实现客户端请求和URL相互...
  • 6.3 认我测在线认证检测系统的主要功能实现 36 6.3.1用户查询 36 6.3.2订单操作 37 6.3.3个人信息维护 37 6.4.系统功能测试 38 6.4.1 首页功能模块 38 6.4.2 订单功能模块 38 6.4.3 个人信息模块 39 6.4.4页面自适应...
  • Fragment

    2018-06-05 20:47:39
    主要目的是为了给大屏幕(如平板电脑)上更加动态和灵活UI设计提供支持。由于平板电脑屏幕比手机屏幕大很多,因此可用于组合和交换UI组件空间更大,利用Fragment实现此类设计时,就无需管理对视图层次结构...
  • MVVM+RAC

    2017-07-25 17:00:26
    一. MVVM 作用:维护性较强,耦合性低 ViewModel: 相比较于MVC新引入的视图模型。是视图显示逻辑、验证逻辑、网络请求等代码存放地方,唯一要注意是,任何视图本身引用...MVVM模式主要目的是分离视图(view)和模型(m
  • Fragment 详情

    2018-05-12 14:12:54
    主要目的是为了给大屏幕(如平板电脑)上更加动态和灵活UI设计提供支持。由于平板电脑屏幕比手机屏幕大很多,因此可用于组合和交换UI组件空间更大,利用Fragment实现此类设计时,就无需管理对视图层次结构...
  • xwork 原理

    2013-08-14 15:29:54
    7.3 XWork概览在了解了数据流和控制流的来龙去脉之后,我们再...7.3.1 XWork的宏观视图XWork的宏观构成示意图是XWork体系结构的核心,这个示意图我们曾经在第三章中向读者展示过,不过当时我们的引入此图的主要目的...
  • Louis是一本讲数据库设计的书的4个版本的主要作者。Louis主要的兴趣领域是数据库架构和用T-SQL编码,并且,他设计过许多数据库,在这许多年中编写过数以千计的存储过程和触发器。  Scott Klein是一位独立咨询师,对...
  • js诞生1995年,主要目的是在客户端处理验证。 一个完整js实现有三部分: 核心(ECMAScript) 提供核心语言功能 文档对象模型(DOM)提供访问和操作网页内容方法和接口 浏览器对象模型(BOM)提供和浏览器交互...
  • 内存处理是编程人员容易出现问题地方,忘记或者错误内存回收会导致程序或系统不稳定甚至崩溃,Java提供GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存...
  • 主要目的是为大屏幕(如平板电脑)上更加动态和灵活界面设计提供支持。 由于平板电脑屏幕尺寸远胜于手机屏幕尺寸,因而有更多空间可供我们自由去组合界面。 利用Fragment是绝佳实践方式,无需对视图层次结构...
  • 数仓工具—Hive进阶之索引(1)

    千次阅读 2020-12-28 09:08:14
    Hive从0.7.0版本开始引入了索引,目的是提高Hive表指定列查询速度。没有索引时候,Hive在执行查询时需要加载整个表或者整个分区(分区表并提供了相关过滤条件),即使你加了带有谓词查询(如'WHERE table.column...
  • UML建模风格之部署图

    2009-08-01 12:01:00
    一个UML部署图(对象治理组织2001)描述了一个运行时硬件结点,以及在这些结点上运行软件组件静态视图。 部署图显示了系统硬件,安装在硬件上软件,以及用于连接异构机器之间中间件。 创建一个部署...
  • Vue.js学了有一段时间了,现在把知识点复习和整理一遍,以免遗忘 目录 一、MVC、MVVM模式简介 ...主要是基于分层的目的,让彼此职责分开。View通过Controller来和Model联系,Controller是View和Model协调者,
  • Polymer——Template

    2014-04-25 11:37:00
    template是polymer element中一个重要组成部分,主要有两种使用目的,一是构建Shadow Dom,二是用于数据绑定和视图渲染。 1、可以在template里面放置css、html代码,<template>标签外,html标记不会被...
  • 视图的 one-way data-binding 开发效率就会有较大的提升。 而这种已经在运作多年的多人维护系统,引入新的 MVVM 框架并不是一个非常好的选择,在兼容性和风险规避上大家都有诸多的考虑。于是就构思了一...
  • 1.1.1 C++ Builder 5的主要特点 1.1.2 C++ Builder 5的新增功能 1.1.3 C++ Builder 5的安装与运行 1.2 C++ Builder 5的集成开发环境 1.2.1 窗体 1.2.2 菜单栏 1.2.3 加速栏 1.2.4 控件栏 1.2.5 对象观察器 1.2.6 ...
  • The GNU C Library :本手册的目的是告诉你如何使用GNU C库。 框架 C++通用框架和库 abseil-cpp :Abseil C ++ 通用库。 Apache C++ Standard Library:是一系列算法,容器,迭代器和其他基本组件集合。 ...
  •  Shane Conder拥有丰富开发经验,在过去10年中,他把主要精力集中在移动和嵌入式开发领域,迄今已设计并开发了基于BREW、J2ME、Windows Mobile和Android诸多商业软件。Shane撰写了大量关于移动通信行业和评估...
  • Transact-SQL 权威指南--详细书签版

    热门讨论 2013-02-04 13:25:19
    7.3 获取视图的源代码 148 7.4 可修改的视图 149 7.5 WITH CHECkOPTION 149 7.6 派生表 150 7.7 动态视图 151 7.8 使用视图划分数据 152 7.9 小结 154 第8章 统计函数 155 8.1 关于CASE 156 8.2 关于效率的...
  • java 面试题 总结

    2009-09-16 08:45:34
    内存处理是编程人员容易出现问题地方,忘记或者错误内存回收会导致程序或系统不稳定甚至崩溃,Java提供GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    UML的主要内容 UML与OO(面向对象) UML的概念 UML的概念 UML Unified Modeling Language 统一建模语言 统一建模语言是一种通用的可视化建模语言,用于对软件系统的制品进行规范化、可视化处理,然后构造它们并...
  • C++MFC教程

    热门讨论 2013-05-21 13:37:15
    这样做的目的主要是增加对语言熟悉程度,同时也训练自己思维和熟悉一些在编程中常犯错误。更重要是理解并能运用C++各种特性,这些在以后开发中都会有很大帮助,特别是利用MFC进行开发朋友对C++一定...
  • Bit 会分析该文件的引入的依赖(例如代码中 import 或 require 语句)。依赖图谱使组件独立于项目存在,可以跨项目移动且不丢失任何引用。 需要注意是,这里追踪依赖项只包含使用 NPM...

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

引入视图的主要目的