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在不缩放javafx形状位置的情况下调整其大小   基于java Hibernate注释的查询执行错误?   swing Java游戏开发:图形   java Apache Commons FileUtil工具在相等文件比较时不返回true   java实时数据库在连续单击按钮时更新同一对象   javaxml数字签名与JAXWS   使用IntelliJ将Java模块作为AndroidGradle模块和非Radle Java模块的依赖项   java Android文本视图快速更改字体大小   java如何旋转长方体Libgdx   java在不使用lastIndexOf()的情况下打印字符串的最后一个索引   java在bean生命周期中何时调用setter注入   java Android:替换缺失的安全体系结构   正在获取警报插入“=在selenium和java中使用if语句时检查null   java类导入显示编译错误   java未知崩溃   java将活动元素的排列设置为lefttoright(defualt)