跳转到主要内容

Pyramid的通用用户注册

项目描述

horus 为Pyramid Web框架提供通用用户注册,如果您的Web应用使用sqlalchemy。

它是一个可插拔的Web应用程序,提供用户注册、登录、登出和更改密码功能。horus 遵循最小干扰原则,因此您的应用可以保持现有的模型。

最小集成

  • 创建一个virtualenv并激活它。安装pyramid并创建您的pyramid项目。

  • 编辑您的 setup.py 以将“horus”添加到 install_requires 列表中的依赖项。

  • 在您的项目上运行 python setup.py develop 以将所有依赖项安装到您的virtualenv中。

  • 创建您的SQLAlchemy声明初始化。

  • 创建从horus的抽象模型继承的模型。在文件 horus/tests/models.py 中找到一个示例。

    或者,使用horus脚手架脚本

    horus_scaffold development.ini > your_app/auth_models.py

    然后您只需告诉类在哪里找到您的声明基类,就可以开始了!

  • 像这样在 main() 函数中包含horus

    # Tell horus which SQLAlchemy scoped session to use:
    from hem.interfaces import IDBSession
    registry = config.registry
    registry.registerUtility(my_sqlalchemy_scoped_session, IDBSession)
    
    config.include('horus')
    config.scan_horus(auth_models_package_or_module)

    使用上述 config.scan_horus() 调用,您需要编辑您的 .ini 配置文件,并告诉 horus 使用哪些模型类,如下所示

    horus.user_class = my_app.models:User horus.activation_class = my_app.models:Activation

    作为对 config.scan_horus() 以及该配置的替代方案,如果您愿意,可以显式注册这些类。这必须在 config.include('horus') 之上完成

    # Tell horus which models to use:
    from horus.interfaces import IUserClass, IActivationClass
    registry.registerUtility(User, IUserClass)
    registry.registerUtility(Activation, IActivationClass)
    
    config.include('horus')
  • 在您的 .ini 配置文件中配置 horus.login_redirecthorus.logout_redirect 以设置重定向路由。

  • 如果您尚未这样做,请根据 Pyramid 文档中的 Sessions 章节配置 HTTP 会话工厂。

  • 创建您的数据库和表。也许甚至一个初始用户。

  • 确保在 config = Configurator(...) 调用中传递 authentication_policy 参数。有关详细信息,请参阅 Pyramid 文档。

  • 现在登录表单应该出现在 /login,但 /register 不应该。

  • 包含 pyramid_mailer 包以用于验证电子邮件和“忘记密码”电子邮件。

    config.include('pyramid_mailer')
  • /register 表单应该出现,尽管外观丑陋。现在您有关于通过电子邮件激活用户的选择。

    • 您只需在您的 .ini 文件中设置即可禁用它

      horus.require_activation = False
    • 否则,根据其文档配置 pyramid_mailer 并测试注册页面。

  • 如果您正在使用 pyramid_tm 或 ZopeTransactionManager,您的基本集成已完成。(页面看起来很丑,但正在工作。继续阅读…)

需要 session.commit() 吗?

horus 不需要 pyramid_tm 或 ZopeTransactionManager 与您的会话,但如果没有使用它们,您就必须多走一步。我们不为您提交事务,因为这真的不太好!

您所要做的就是订阅扩展事件,并自己提交会话。这也给了您进行一些额外处理的机会。

from horus.events import (
    PasswordResetEvent, NewRegistrationEvent,
    RegistrationActivatedEvent, ProfileUpdatedEvent)

def handle_request(event):
    request = event.request
    session = request.registry.getUtility(IDBSession)
    session.commit()

self.config.add_subscriber(handle_request, PasswordResetEvent)
self.config.add_subscriber(handle_request, NewRegistrationEvent)
self.config.add_subscriber(handle_request, RegistrationActivatedEvent)
self.config.add_subscriber(handle_request, ProfileUpdatedEvent)

修改表单

如果您想修改任何表单,只需注册要使用的新 deform 类。

您可以覆盖 horus.interfaces 的接口有

  • IHorusLoginForm

  • IHorusRegisterForm

  • IHorusForgotPasswordForm

  • IHorusResetPasswordForm

  • IHorusProfileForm

这是您如何做到的(MyForm 是一个自定义 deform 表单类)

config.registry.registerUtility(MyForm, IHorusLoginForm)

修改模板

如果您想替换模板,可以使用 pyramid 的 override_asset

config.override_asset(to_override='horus:templates/template.mako',
    override_with='your_package:templates/anothertemplate.mako')

您可以覆盖的模板有

  • login.mako

  • register.mako

  • forgot_password.mako

  • reset_password.mako

  • profile.mako

如果您想用 Jinja2 或任何其他模板语言覆盖模板,只需覆盖视图配置

config.add_view('horus.views.AuthController', attr='login',
    route_name='login', renderer='yourapp:templates/login.jinja2')
config.add_view('horus.views.ForgotPasswordController',
    attr='forgot_password', route_name='forgot_password',
    renderer='yourapp:templates/forgot_password.jinja2')
config.add_view('horus.views.ForgotPasswordController',
    attr='reset_password', route_name='reset_password',
    renderer='yourapp:templates/reset_password.jinja2')
config.add_view('horus.views.RegisterController', attr='register',
    route_name='register', renderer='yourapp:templates/register.jinja2')
config.add_view('horus.views.ProfileController', attr='profile',
    route_name='profile', renderer='yourapp:templates/profile.jinja2')

修改字符串

看看 这个类。这是我们在 horus 中存储所有字符串的地方。如果您想更改一条或两条消息,只需创建这个类的子类,然后做

from horus.interfaces import IUIStrings
config.registry.registerUtility(MyStringsClass, IUIStrings)

修改主键列名

如果您想覆盖主键属性名称,可以通过创建一个新的 mixin 类来实现

class NullPkMixin(Base):
    abstract = True
    _idAttribute = 'pk'

    @declared_attr
    def pk(self):
        return Base.pk

    @declared_attr
    def id(self):
        return None

class User(NullPkMixin, UserMixin):
    pass

horus 开发

https://github.com/eventray/horus

如果您想帮助修改 horus,可以使用 py.test 运行其单元测试

py.test

检查测试覆盖率

py.test --cov-report term-missing --cov horus

测试也可以并行运行

py.test -n4

我们正在使用这个构建服务器: http://travis-ci.org/#!/eventray/horus

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码发行版

horus-0.9.15.tar.gz (174.2 kB 查看哈希值)

上传时间 源代码

支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面