TurboGears2的可插拔应用程序,它提供一个带有表单的基本用户配置文件页面,允许用户编辑自己的配置文件或更改电子邮件/密码
tgapp-userprofile的Python项目详细描述
关于用户配置文件
userprofile是turbogears2的可插入应用程序,它提供了一个基本用户 配置文件页,包含允许用户编辑自己的配置文件或更改密码或电子邮件的表单。
userprofile同时处理sqlachemy和ming后端。
安装
用户配置文件既可以从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来美化UserForm
或ChangePasswordForm
表单布局的样式,在你的应用程序中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
中,找到ApplicationAuthMetadata
的authenticate
方法:它应该返回用户的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)