TurboGears2的可插拔应用程序,它提供一个带有表单的基本用户配置文件页面,允许用户编辑自己的配置文件或更改电子邮件/密码

tgapp-userprofile的Python项目详细描述


https://travis-ci.org/axant/tgapp-userprofile.svg?branch=masterhttps://coveralls.io/repos/github/axant/tgapp-userprofile/badge.svg?branch=master

关于用户配置文件

userprofile是turbogears2的可插入应用程序,它提供了一个基本用户 配置文件页,包含允许用户编辑自己的配置文件或更改密码或电子邮件的表单。

userprofile同时处理sqlachemyming后端。

安装

用户配置文件既可以从pypi安装,也可以从github安装:

pip install tgapp-userprofile

应该只对大多数用户有效

插入用户配置文件

在应用程序中config/app_cfg.py导入plug

from tgext.pluggable import plug

然后在文件的结尾处使用userprofile调用plug:

plug(base_config, 'userprofile')

您可以访问您的个人资料 http://localhost:8080/userprofile

选项

tgapp-userprofile支持一些可以传递的选项 使用plug方法自定义应用程序的各个方面:

  • user_partial-要显示到用户配置文件页中的部分的路径。
    可在不更改模板的情况下向配置文件页添加更多数据
  • custom_css-将用于配置文件页而不是默认配置文件页的css文件的路径。

用户属性

tgapp-userprofile在用户类实例中查找各种属性 要驱动其默认行为,最重要的属性是profile_data 属性,该属性可以为字典提供要显示的用户信息。 在“配置文件”页上,但可以使用其他属性来调整行为:

剖面数据

要显示到配置文件页的条目字典, 默认词典的构建方式是:

{'display_name':('Display Name', user.display_name),
 'email_address':('Email Address', user.email_address)}

字典的每个键如果字段的id,在大多数情况下 它将具有相同的用户属性名,其中 该字段已存储。字典的值是元组 其中第一个值是将 显示,第二个是字段的实际值。

如果avatar密钥可用,则 用户的化身图像的url。如果没有 用户配置文件将查找一个tgapp-fbauthFacebook虚拟形象或将 回退到默认化身。

display_name键将用作配置文件页标题。

外形

可用于编辑用户配置文件的toscawidgets或tw2表单。 默认情况下,为中的每个条目自动生成一个文本字段 profile_data已提供。

保存配置文件

将接收编辑提交的用户数据的可调用 表单并相应地更新用户。

默认情况下,值将按原样存储到用户字段中 具有提供给profile_data的相同ID。

引导程序布局

如果你想使用bootstrap来美化UserFormChangePasswordForm表单布局的样式,在你的应用程序中cfg:

def replace_profile_form_layout():
    from axf.bootstrap import BootstrapFormLayout
    from userprofile.lib import UserForm
    from userprofile.lib import ChangePasswordForm

    UserForm.child = BootstrapFormLayout(children=UserForm.child.children)
    UserForm.submit.css_class = 'btn-primary form-control'

    ChangePasswordForm.child = BootstrapFormLayout(children=ChangePasswordForm.child.children)
    ChangePasswordForm.submit.css_class = 'btn-primary form-control'

milestones.config_ready.register(replace_profile_form_layout)

身份验证配置

由于使用userprofile用户可以更改其电子邮件地址或用户名,因此必须配置repoze.who 是的。 在app_cfg.py中,找到ApplicationAuthMetadataauthenticate方法:它应该返回用户的id。 现在repoze.who将把用户id保存在cookie中以标识用户,并且由于此id不会更改,因此 身份验证过程允许用户安全地更改电子邮件地址和用户名。

此示例演示了使用ming:

基于用户名或电子邮件地址的登录
class ApplicationAuthMetadata(TGAuthMetadata):
    def __init__(self, sa_auth):
        self.sa_auth = sa_auth

    def get_query(self, login):

        try:
            _id = ObjectId(login)
        except InvalidId:
            _id = login

        return {
            '$or': [{'email_address': login},
                    {'user_name': login},
                    {'_id': _id}],
            'blocked': {'$ne': True},
        }

    def authenticate(self, environ, identity):
        login = identity['login']
        user = self.sa_auth.user_class.query.find(self.get_query(login)).first()

        if not user:  # pragma: no cover
            login = None
        elif not user.validate_password(identity['password']):
            login = None

        if login is None:
            try:
                from urllib.parse import parse_qs, urlencode
            except ImportError:
                from urlparse import parse_qs
                from urllib import urlencode
            from tg.exceptions import HTTPFound

            params = parse_qs(environ['QUERY_STRING'])
            params.pop('password', None)  # Remove password in case it was there
            if user is None:  # pragma: no cover
                params['failure'] = 'user-not-found'
            else:
                params['login'] = identity['login']
                params['failure'] = 'invalid-password'

            # When authentication fails send user to login page.
            environ['repoze.who.application'] = HTTPFound(
                location=environ['SCRIPT_NAME'] + '?'.join(('/login', urlencode(params, True)))
            )

        return str(user._id) if user and login else login

    def get_user(self, identity, userid):
        return self.sa_auth.user_class.query.find(self.get_query(userid)).first()

    def get_groups(self, identity, userid):
        return [g.group_name for g in identity['user'].groups]

    def get_permissions(self, identity, userid):
        return [p.permission_name for p in identity['user'].permissions]


base_config.sa_auth.authmetadata = ApplicationAuthMetadata(base_config.sa_auth)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java接口中的每个方法都是抽象的,但在抽象类中,我们也只能使用抽象方法   初始化Java中声明的、未初始化的变量会发生什么情况?   java BouncyCastle openPGP将字节[]数组加密为csv文件   在Java中将类A(和所有子类)映射到类B的实例的字典   RSA公钥编码,在Java和Android中,代码相同,结果不同   java在安卓中实现数字检测语音识别   java取消选择复选框   java如何在其他配置中重用Maven配置XML片段   java有没有一种有效的方法来检查HashMap是否包含映射到相同值的键?   spring处理程序调度失败;嵌套的例外是java。lang.NoClassDefFoundError:org/apache/http/client/HttpClient   带有ehcache的java多层缓存   java如何访问chromium(或任何其他浏览器)cookie   java通过将两个集合与spring data mongodb data中的条件合并来获取计数   安卓中R.java的语法错误