Google Appengine + Jinja2:根据“用户角色”输出不同的模板

时间:2013-12-16 20:52:03

标签: google-app-engine python-2.7 jinja2 app-engine-ndb webapp2

我想根据登录用户的角色为webapp的首页输出不同的模板。

我使用 PolyModel 数据模型构建了两种类型的“帐户”:

class Account(polymodel.PolyModel):
    username = ndb.StringProperty(required = True)
    pw_hash = ndb.StringProperty(required = True)
    email = ndb.StringProperty(required = True)

class Farmer(Account):
    name = ndb.StringProperty(required = True)

class FarmCompany(Account):
    name = ndb.StringProperty(required = True)

应用的主页('/')是 index.html ,它使用 jinja2 继承自 base.html

base.html文件:

<!DOCTYPE html>
<html>
    <head>
      <title>Farmers App</title>
    </head>
    <body>
        {% block content %}  
        {% endblock %}
    </body>
</html>

的index.html:

{% extends "base.html" %}
{% block content %}
    {{ content }}
{% endblock %}

现在,因为我使用了PolyModel数据结构,所以每个'Account'实体都存储如下:

农民帐户'实体示例:

Farmer(
    key=Key('Account', 5066549580791808), 
    class_=[u'Account', u'SkilledPerson'],
    name=u'Haopei', ...)

FarmCompany'帐户'实体示例:

FarmCompany(
    key=Key('Account', 6863449581091834), 
    class_=[u'Account', u'FarmCompany'],  
    name=u'Big Farm Company', ...)

这意味着我可以使用以下函数获取帐户类型:

def check_user_role_by_uid(self, uid):
    user = Account.get_by_id(uid)
    return user.class_[1] #returns 'Farmer' or 'FarmCompany'

所以我的问题是:

如何根据登录用户是“农民”还是“农场公司”创建两个单独的“index.html”?

2 个答案:

答案 0 :(得分:1)

另一种方法:在python中,您可以发送account_type作为参数。例如:

 return {'account': check_user_role_by_uid(uid)}

使用jinja2,您可以选择正确的模板,重复使用HTML并为每个帐户添加特定代码。如果之后您有更多帐户,则更容易扩展

index.html
{% if account == 'Farmer' %}
  {% extends "farmer_base.html" %} {# you can extend from different base #}
{% else %}
  {% extends "farmcompany_base.html" %}
{% endif %}

{% block content %}
    {{ content }}
    {% if account == 'Farmer' %}
      {# Some Farmer stuff #} {# or you can add particular code for an account #}
     {% endif %}
{% endblock %}

答案 1 :(得分:0)

您将创建两个不同版本的index.html。我们称之为index_farm.html和index_farmcompany.html。

然后在你的处理程序中,你将使用适当的版本:

class myHandler(webapp2.RequestHandler): 
    def get(self):
        # somehow get account uiod
        type =  Account.check_user_role_by_uid(uid)
        if type == 'SkilledPerson':
            self.render('index_farm.html')
        elif type == 'FarmCompany':
            self.render('index_farmcompany.html')