zoukankan      html  css  js  c++  java
  • Flask AppBuilder Base Views

    Base Views

    所有视图都从这个类继承。它的构造函数将在Flask注册您的url作为一个蓝图,以及所有需要定义和保护的安全权限。

    您可以使用这种视图来实现您自己的自定义页面,将其附加到菜单上,或者将其链接到您的站点。

    使用 @expose来修饰您的url路由方法。另外,添加@hasaccess修饰器来告诉烧瓶,这是一个安全保护的方法。

    使用Flask-AppBuilder-Skeleton。编辑视图。py文件并添加:

    from flask_appbuilder import AppBuilder, expose, BaseView
    from app import appbuilder
    
    class MyView(BaseView):
        route_base = "/myview"
    
        @expose('/method1/<string:param1>')
        def method1(self, param1):
            # do something with param1
            # and return it
            return param1
    
        @expose('/method2/<string:param1>')
        def method2(self, param1):
            # do something with param1
            # and render it
            param1 = 'Hello %s' % (param1)
            return param1
    
    appbuilder.add_view_no_menu(MyView())

    这个简单的示例将用两个路由url来注册您的视图:

    /myview/method1/<string:param1>
    /myview/method2/<string:param1>

    不会为此创建菜单,也不会创建安全权限。如果您想为您的方法启用详细的安全访问,请使用@hasaccess修饰器。现在运行这个例子

    $ fabmanager run

    您可以使用以下url来测试您的方法

    http://localhost:8080/myview/method1/john

    http://localhost:8080/myview/method2/john

    正如您所看到的,这些方法是公开的。所以让我们保护他们。改变views.py,

    from flask_appbuilder import AppBuilder, BaseView, expose, has_access
    from app import appbuilder
    
    
    class MyView(BaseView):
    
        default_view = 'method1'
    
        @expose('/method1/')
        @has_access
        def method1(self):
            # do something with param1
            # and return to previous page or index
            return 'Hello'
    
        @expose('/method2/<string:param1>')
        @has_access
        def method2(self, param1):
            # do something with param1
            # and render template with param
            param1 = 'Goodbye %s' % (param1)
            return param1
    
    appbuilder.add_view(MyView, "Method1", category='My View')
    appbuilder.add_link("Method2", href='/myview/method2/john', category='My View')

    请注意,这些方法将使简单的页面与FAB的外观和感觉无法整合。将应用程序的外观和感觉集成到应用程序的响应中很容易,因此您必须创建自己的模板。在您的项目目录和应用程序文件夹下创建一个名为“templates”的文件夹。里面创建一个文件名'method3.html'

    { % extends  “appbuilder / base.html”  %} 
    { % block  content  %} 
        < h1 > {{ param1 }} </ h1 > 
    { % endblock  %}

     在MyView上添加以下方法

    from flask import render_template
    
    @expose('/method3/<string:param1>')
    @has_access
    def method3(self, param1):
        # do something with param1
        # and render template with param
        param1 = 'Goodbye %s' % (param1)
        self.update_redirect()
        return self.render_template('method3.html',param1 = param1)

    创建一个菜单链接到您的新方法:

    appbuilder.add_link("Method3", href='/myview/method3/john', category='My View')

    你可以看到你只需要在你的模板上扩展“appbuilder / base.html”,然后覆盖块内容你有许多其他的可以覆盖或扩展诸如css include,javascript,headers,tail等等的东西...接下来使用Flaskrender_template来渲染你的新模板。

    注意
    
    更新重定向,在版本0.10.3,重定向算法被审查,并使用会话cookie保存5个导航历史记录。这对于重定向回来,保持url参数和改进UI体验非常有用。您必须调用self.update_redirect()将当前url插入导航历史记录。有时您可能希望跳过更新,例如表单验证错误,以便在验证错误之前,后台操作不会将您发送到同一个表单。
    
    注意 自1.3.0版以来,您必须渲染所有的视图模板,如self.render_template,这是因为base_template(可以被覆盖)和appbuilder现在总是传递给模板。

    子类SimpleFormView或PublicFormView为您的自定义窗体视图提供基础处理。

    通常,您将需要这种视图来呈现不是基于数据库模型的表单,因为当它们执行时,FAB可以自动生成它们,并且可以向其添加或删除字段以及自定义验证器。为此,您可以使用ModelView。

    from wtforms import Form, StringField
    from wtforms.validators import DataRequired
    from flask_appbuilder.fieldwidgets import BS3TextFieldWidget
    from flask_appbuilder.forms import DynamicForm
    
    
    class MyForm(DynamicForm):
        field1 = StringField(('Field1'),
            description=('Your field number one!'),
            validators = [DataRequired()], widget=BS3TextFieldWidget())
        field2 = StringField(('Field2'),
            description=('Your field number two!'), widget=BS3TextFieldWidget())

    现在定义您的表单视图来公开url,创建一个菜单条目,创建安全访问,定义pre和post处理。

    实现formget和formpost来实现表单的预处理和后处理。您可以使用formget来预先填入表单,并在应用程序中预先处理某些内容,然后使用formpost在用户提交后将表单提交给表单,您可以将数据保存到数据库、发送电子邮件或其他需要的操作。

    from flask_appbuilder import SimpleFormView
    from flask_babel import lazy_gettext as _
    
    
    class MyFormView(SimpleFormView):
        form = MyForm
        form_title = 'This is my first form view'
        message = 'My form submitted'
    
        def form_get(self, form):
            form.field1.data = 'This was prefilled'
    
        def form_post(self, form):
            # post process form
            flash(self.message, 'info')
    
    appbuilder.add_view(MyFormView, "My form View", icon="fa-group", label=_('My form View'),
                         category="My Forms", category_icon="fa-cogs")

    请注意,此类派生自BaseView,因此可以覆盖父类的所有属性。还要注意标签如何使用babel的lazy_gettext作为_('text')功能,以便您的菜单项可以翻译。

    你可以在SimpleForm上找到这个例子

  • 相关阅读:
    每日总结6.14
    每日总结6.13
    每日总结6.12
    每日总结6.11
    用户故事与敏捷方法阅读笔记4
    用户故事与敏捷方法阅读笔记3
    团队冲刺第一阶段燃尽图
    团队冲刺10
    智能物联网:将人工智能的力量带入物联网
    MyEclipse修改文件后Building workspace时间过长
  • 原文地址:https://www.cnblogs.com/Jonecmnn/p/7610399.html
Copyright © 2011-2022 走看看