V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
yueyoum
V2EX  ›  Python

正在做一个完整的Django用户系统app,欢迎大家贡献代码

  •  
  •   yueyoum ·
    yueyoum · 2013-06-12 23:36:21 +08:00 · 17575 次点击
    这是一个创建于 4200 天前的主题,其中的信息可能已经有所发展或是发生改变。
    https://github.com/yueyoum/django-siteuser

    目标就是在写新站点的时候,不用再在用户系统上浪费时间

    具体说明可以看github,

    欢迎大家提建议,fork & pull request
    第 1 条附言  ·  2013-06-21 23:54:21 +08:00
    已经完成基本功能 发布了 0.1.0 版

    现在可以用 pip 安装

    pip install django-siteuser
    41 条回复    1970-01-01 08:00:00 +08:00
    nick32m
        1
    nick32m  
       2013-06-13 11:10:05 +08:00
    顶一下
    jinbakei
        2
    jinbakei  
       2013-06-13 11:14:43 +08:00   ❤️ 1
    加油!有用!
    niko
        3
    niko  
       2013-06-13 12:21:05 +08:00
    这个支持一下~正在用java写,呵呵
    kk71
        4
    kk71  
       2013-06-13 15:12:05 +08:00
    啊啊好东西!
    llbgurs
        5
    llbgurs  
       2013-06-13 20:58:51 +08:00
    开源什么许可?
    okidogi
        6
    okidogi  
       2013-06-13 21:24:28 +08:00
    这个系统完全可以将 django-registration, django-profile, django-social-auth, django-avatar 组合起来,改改template就行了。重复开发费时费力的。

    或者直接用pinax, https://github.com/pinax/pinax
    yueyoum
        7
    yueyoum  
    OP
       2013-06-13 22:54:22 +08:00   ❤️ 1
    @okidogi
    恩, 经常逛github 你说的那些我也知道,但并不是我想要的。
    虽然这些我没用过, 但看源码发现了这些问题

    django-registration 使用了django内建的 auth.User 因为admin用户也在这个表中,我个人不喜欢将普通用户与管理员帐号放到一张表中

    django-profile 也是同样的使用了 auth.User

    django-social-auth 到是可以自己指定user表,但其自身并不是面向中国大陆的,所以,其自身只提供了 豆瓣和新浪微博 的认证。
    而我自己有一个 socialoauth 库, 支持了大陆8大网站的认证, 所以这块还是自己做的方便。

    django-avatar 是一个用户可以有多个头像,这种我觉得不需要,而且大陆网站似乎很少提供这种让用户传多个头像,然后想换的时候就换的功能,所以新建立的面向大陆用户的网站还是保持一个用户一个头像的好

    好像django-profile 也可以上传头像,
    但这两个上传的效果如何,并不知道。

    我也有一个 django-upload-avatar ,它更符合国人的使用习惯, 选择图片后可以剪裁预览。

    并且,我现在这个项目是完完全全面向国内网站的,所以内部直接用了汉字。没用i18n,
    django在关闭 I18N的情况下,性能有少许提升

    可以参考它们的代码,但如果学习一个库的代价远远大于自己实现的时候, 还不如自己直接实现来的好。
    yueyoum
        8
    yueyoum  
    OP
       2013-06-13 22:55:53 +08:00
    @llbgurs
    BSD 等项目完成后, 会放上 LICENSE
    moyaya
        9
    moyaya  
       2013-06-13 22:56:26 +08:00
    这个非常的支持,当初我们开发这个花了不少时间。
    yueyoum
        10
    yueyoum  
    OP
       2013-06-13 22:59:06 +08:00
    @moyaya
    啊, 方便的话,就放到github上, 好让我去围观下
    soli
        11
    soli  
       2013-06-13 23:04:58 +08:00
    感兴趣。围观。
    metaclass
        12
    metaclass  
       2013-06-14 00:02:12 +08:00
    你这个说是不重新发明轮子,其实是自己发明了一套轮子……不过Django 1.5开始支持自定义用户系统了,只要按照它的规范做好几个需要的东西,别的app都能兼容

    简单看了下代码,还是比较规范的。支持!另外建议项目语言搞成英文的,这样参与者更多
    metaclass
        13
    metaclass  
       2013-06-14 00:05:21 +08:00
    @yueyoum 你可以看看django-userena和django-allauth,我两个项目分别用了它们。django-allauth是集成了local用户系统和social用户系统,其social用户系统可以挂载多个账户。代码质量上django-userena高一些,django-allauth的比较山寨,供你参考
    yueyoum
        14
    yueyoum  
    OP
       2013-06-14 10:18:59 +08:00
    @metaclass 好,我研究下 userena
    yueyoum
        15
    yueyoum  
    OP
       2013-06-15 23:13:53 +08:00
    今天把 修改/重置 密码的功能加上了。
    现在 用户系统 本身 的功能基本完成了。

    下面就是 完善 ,并且再加上 通知系统
    coosir
        16
    coosir  
       2013-06-16 09:17:45 +08:00 via Android
    不错 其实我想问有没有php版类似的东东
    risent
        17
    risent  
       2013-06-16 13:59:01 +08:00
    好奇一下问什么要重写一个send_mail? 如果用Django自带的mail系统,只需settins.py里配置个不同的backend(比如django-celery-email)就可以实现邮件的异步发送了.
    yueyoum
        18
    yueyoum  
    OP
       2013-06-16 14:10:04 +08:00
    @risent 你说的对, 我那个自己写的send_mail只是暂时之举,最后会替换掉的。
    risent
        19
    risent  
       2013-06-16 14:24:56 +08:00
    @yueyoum 顺便问下楼主如果遇到一个project下的apps太多,导致user字段过多的时候,想把apps分到不同的project下面去的时候,这个user系统怎么处理比较好?
    yueyoum
        20
    yueyoum  
    OP
       2013-06-16 20:13:34 +08:00
    @risent
    没明白你的问题

    apps 多少 和 user字段有必要联系?
    如果一个app干的事情和 user 本身没丝毫关系, 那它不会给user增加字段的。

    我的理解是一个站点一个project, 不同的project就是不同的站点的。

    或者你举个例子,我看看你说的是哪种情况
    risent
        21
    risent  
       2013-06-17 02:06:05 +08:00
    @yueyoum 比如我要做个站点,这个站点包括 商城,论坛,问答这几个系统(陆续还会有新的系统添加),然后每个系统都会有相应的积分,等级,签名等直接添加到User上面的字段,如果不添加到User上面,操作起来会很麻烦,这个时候User上面的字段就会太多.我的想法是把各个系统独立开来,但是这个时候用户的同步就不好处理.
    yueyoum
        22
    yueyoum  
    OP
       2013-06-17 12:05:20 +08:00
    @risent
    似乎明白你说的了, 系统归系统,我的理解是 这些系统是一个一个的app,而不是project
    现在很多 reusable app 的通用做法就是 让你指定你的 user model, 如果你没指定,默认就是 'auth.User'

    然后他们就会这么用:

    user_model = getattr(settings, 'USER_MODEL', None) or 'auth.User'
    class User(models.Model):
    user = models.OneToOneField(user_model, related_name='xxx')
    # 其他字段,比如 积分,等级

    如果每个app都有上面的操作, 从实现上讲,确实可以达到给user添加字段的效果,并且也能正常工作。

    但这个问题就是 性能问题, 取一个user信息,可能也会带着 多表join.

    这也是我做 django-siteuser的一个原因, 直接把user本身信息放入一个表,而不是引入很多app,做很多join查询。

    如果 商城,论坛 这些app 有现成的第三方的, 我建议可以修改一下, 把它们的user表直接提出来,做成一个。

    虽然user上面的字段变多了,但是不会有太多join的情况了
    这种时候 各个系统任然是独立的, 只是 user共用一个而已
    yueyoum
        23
    yueyoum  
    OP
       2013-06-21 23:54:02 +08:00
    已经完成基本功能 发布了 0.1.0 版

    现在可以用 pip 安装

    pip install django-siteuser
    iiduce
        24
    iiduce  
       2013-06-21 23:59:42 +08:00
    @yueyoum 0.1版完成了“功能列表”里的哪些功能?
    yueyoum
        25
    yueyoum  
    OP
       2013-06-22 00:34:30 +08:00
    @iiduce
    除了消息系统 可能不够通用外,
    其他的都完成了,

    但在使用siteuser的时候 可以不使用notify系统
    leejaen
        26
    leejaen  
       2013-06-28 10:01:01 +08:00
    @yueyoum
    这个系统是跟social oauth一起用的吗?昨天没找到social oauth在django的具体用法,回复到你的微博了……
    yueyoum
        27
    yueyoum  
    OP
       2013-06-28 10:30:43 +08:00
    @leejaen
    幸亏你在这里回复下, 我一个月也就上几次weibo

    socialoauth 和 django 集成的例子的你可以看这个 repo
    https://github.com/yueyoum/django-social-login

    但这个已经被我废弃掉了,

    其实 siteuser 这个项目里 更好的展示了 socialoauth 如何与django的结合,
    自身注册用户如何和第三方登陆用户共存。

    就在 siteuser.users 这个app 中
    yueyoum
        28
    yueyoum  
    OP
       2013-06-28 10:44:56 +08:00
    @leejaen
    看到 weibo 留言了,

    如果你不喜欢讲注册用户放入 django自己的用户系统,
    刚好我这个项目就是这样的, 因为我同样不喜欢。

    你可以 看看 siteuser 的 README, 然后先不要设置 USING_SOCIAL_LOGIN
    这样它默认为 False ,不启用 第三方登陆, 这样你就不用设置 SOCIALOAUTH_SITES 这个给 socialoauth 使用的配置了。 因为要设置这个,你需要到第三方网站上去申请开发者,有点麻烦

    先把 siteuser 自身注册,登陆 跑一边,熟悉整个流程后,
    再去 到weibo,豆瓣,QQ 等网站申请开发者,得到key之类的信息,就可以 设置 SOCIALOAUTH_SITES, 然后 在settings.py 中 设置 USING_SOCIAL_LOGIN = True

    然后再体验一下 第三方登陆, 这块可能会遇到不较多的问题,
    需要你也要稍微熟悉一下 OAuth2 的流程。

    需要注意的是你需要在 第三方网站申请为开发者后,要设置 OAuth认证完毕后的回调地址,

    回调地址的形式是 account/oauth/<sitename>

    这个sitename 又是和 SOCIALOAUTH_SITES 里想对应的,
    也就是 如果 SOCIALOAUTH_SITES 里设置了一个名为 weibo 站点的配置,
    那么 你在 新浪开发者的设置中 就要把你的回调地址写成 <URL>/account/oauth/weibo

    <URL> 是你申请网站接入是填写的url

    最好你在本地搭建开发环境的时候,需要在 hosts 中 将 <URL> 指向 127.0.0.1
    然后 开启 nginx ,或者 你直接 让django server 监听在80端口也行
    leejaen
        29
    leejaen  
       2013-06-28 12:42:24 +08:00
    @yueyoum
    这么详细的回复让我有些小感动,oauth我之前弄过微博的,后来想添加腾讯和豆瓣,这个功能不算是最重要的却占很多开发时间,有些本末倒置的感觉,所以查到了你的项目,我先研究下使用方法,通了后我要做第一个吃螃蟹的人。很看好你这个项目。我先fork下
    leejaen
        30
    leejaen  
       2013-06-28 16:13:06 +08:00
    @yueyoum
    今天把项目pull下来爽了一下,但现在我有个新的疑问:django-siteuser用户系统可不可以和原来的admin用户系统并存,可以的话怎么配置。现在在配置的urls里打开adminsite(admin.autodiscover())就会出错,我原本想是网站的用户单独一套系统,后台管理员使用admin site。想问下可不可以达到这个需求?万分感谢
    yueyoum
        31
    yueyoum  
    OP
       2013-06-28 16:23:15 +08:00
    @leejaen
    无需任何配置, siteuser 和 admin 是分离的, 你直接在 clone 出了 example 里 仅仅 admin.autodiscover() 肯定要报错

    因为 example 没有开启 admin

    你看看 settings.py, middleware 和 install_apps 都把 admin 关了,
    你把和 admin 有关的配置开启后, 再次执行 python manage.py syncdb 这时候就要你设置管理员账号了
    leejaen
        32
    leejaen  
       2013-07-01 12:38:58 +08:00
    @yueyoum
    我是在原来开发的项目里加入的siteuser app,按步骤配置完成后出错,上午重新配置下可以了,确实是配置的问题,Thank you! 此外还发现关于版本的两处地方:1. django-siteuser里代码是1.5版本,尤其是url tags 的写法,{% url 'url_name' %} 和 {% url url_name %} 新手表示在1.4里不容易找到,readme里没有标明。2. settings里SITEUSER_EMAIL没有配置的话会出现错误'Settings' object has no attribute 'SITEUSER_EMAIL',是不是1.5里不用配置时以空识别此值的?
    yueyoum
        33
    yueyoum  
    OP
       2013-07-01 12:50:51 +08:00
    @leejaen

    我在1.5的测试的, 所以 url 不同版本的问题,这个我确实不太清楚,

    SITEUSER_EMAIL 这块我偷懒了,没在README里写
    https://github.com/yueyoum/django-siteuser/blob/master/siteuser/functional/__init__.py

    发邮件我没用django 自身的EMAIL设置, 而是自己写的
    我晚上回去把这部分的README 补上。

    你暂时可以随便写个 SITEUSER_EMAIL, 这样,demo可以跑起来,只是修改密码,重置密码发邮件的功能不可用
    yueyoum
        34
    yueyoum  
    OP
       2013-07-02 00:23:02 +08:00   ❤️ 1
    @leejaen
    我把 SITEUSER_EMAIL 的 说明添加到了 README 中, 示例添加到了 example/example/local_settings.py.example 中了


    写文档真是个耐心+体力活啊……
    leejaen
        35
    leejaen  
       2013-07-02 10:29:02 +08:00
    @yueyoum
    看到了,很清晰,一眼即明,赞一个
    leejaen
        36
    leejaen  
       2013-07-04 15:59:29 +08:00
    @yueyoum
    上传图片那里在python2.7+django1.4里会有上传后的文件损坏的情况发生,导致读取时发生错误,不知道是不是python版本的问题还是avatar应用没有配置好的原因。
    具体代码在\siteuser\upload_avatar\views.py文件中的upload_avatar方法的Image.open(fpath)会抛出异常,上传后的图片在windows里出现马赛克花图效果。
    yueyoum
        38
    yueyoum  
    OP
       2013-07-04 16:59:26 +08:00   ❤️ 1
    @leejaen

    https://github.com/yueyoum/django-siteuser/blob/master/siteuser/upload_avatar/views.py#L77

    看view.py 77行, open(fpath, 'w')

    因为我一直在linux中,所以忽略了 open 模式在 linux 和windows 中的不同

    'w' 是以文本形式打开文件, 'wb' 是二进制方式, 这个在windows上是不同的,
    但linux中是一样的, 所以我写的是 'w'

    你改成 'wb' 试试?
    leejaen
        39
    leejaen  
       2013-07-04 17:23:40 +08:00
    @yueyoum
    欧了,我怎么就没想到,还是对linux不太熟悉的原因,要赶紧的装个ubuntu了
    leejaen
        40
    leejaen  
       2013-07-18 15:29:13 +08:00
    @yueyoum 发现了一个用户登录时的bug,已经提交到github
    yueyoum
        41
    yueyoum  
    OP
       2013-07-18 17:22:29 +08:00
    @leejaen 已经merge 了。 Thanks :-)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2150 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:05 · PVG 00:05 · LAX 08:05 · JFK 11:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.