摘要
如何使用Django + MongoEngine 自定义用户模型和自定义身份验证后端(以允许电子邮件/密码身份验证)? (是否需要自定义后端?...即,在使用MongoEngine进行身份验证时使用电子邮件作为用户名.)
在使用Django进行身份验证时,使用Mongo作为主数据存储区时,是否存在使用自定义用户对象的直接(且完整!)示例的文档?(Postgres有更清晰,更全面的文档...)
详情
MongoEngine似乎只为您提供两种身份验证 - "经典"(又名" mongoengine.django.auth.MongoEngineBackend ")方式......或者......"自定义用户模型"(又名' django.contrib.auth) .backends.ModelBackend ')方式 - 在Nicolas Cortot对这里的另一个问题的回答中或多或少简洁地概述了这两种方式:
Python-Social-Auth失败了mongoEngine(Django)
这两种身份验证技术都允许您访问类似于Django的AbstractBaseUser类的authenticate()方法 - 一种依赖于check_password函数的方法.但是,你分钟使用身份验证(如上面的链接概述)的所谓的"自定义用户模型"的味道...... 而随后一对用自定义后端(为了使用电子邮件,要求用户名)......你由于无法访问典型的authenticate()函数而遇到麻烦.
例如,像这样......
# ...with postgres, I'd subclass AbstractBaseUser...but with Mongo...(?) from django.conf import settings from mongoengine.fields import EmailField, BooleanField
from mongoengine.django.auth import User class MyUser(User): email = EmailField(max_length=254, unique=True) is_active = BooleanField(default=True) is_admin = BooleanField(default=False) USERNAME_FIELD = 'email' REQUIRED_FIELDS = '' ... …
可以通过Flask-Login和Flask-Principal插件将身份验证和授权集成到Flask中.(或者也可能通过Flask-Security插件.)
但是:Flask-Admin - 另一个提供后端仪表板的插件 - 不是注册的蓝图......而且,我相信(据我所知),Flask-Login和Flask-Principal使用的装饰器 - 和这是用户访问渲染视图所必需的...那些装饰器仅对作为已注册蓝图一部分的视图进行操作.
两个问题:
1)如何在我的应用程序中注册Flask-Admin作为蓝图,和/或启用Flask-Login和/或Flask-Principal装饰器来保护与Flask-Admin相关的视图?
2)为什么Flask-Login和Flask-Principal仅适用于我的应用程序"本机"部分的对象...而不是从插件导入的对象(例如"Admin"对象)?我怎样才能解决这个问题...如果我确实正确地理解它?
我认为这是一个问题,因为我为我的应用程序的主索引页面创建受保护的视图,或者任何其他具有蓝图内部视图的页面都没有任何问题.我似乎无法为Flask-Admin索引页面执行此操作(同样,它没有蓝图).
我的博客发表于......
http://www.seanbradley.biz/blog
......完全没有格式化.它们只是一大块明文.任何代码或HTML标记,例如/ n或<br /> ...更不用说h1,h2等......对文本在页面上的显示方式没有明显影响.
我正在使用部署在GAE上的WTForms运行Flask.我怎样才能解决这个问题?有没有办法在新的博客文章条目的表单字段中实现WYSGIWYG编辑器(如TinyMCE)?
我想要看起来像......一样简单优雅
要么
...或者至少类似于Stackoverflow自己的编辑器.
格式化在发布时在上述所有帖子中呈现(而不是通过编辑器的grody overblown工具栏).
我不确定在我的帖子中禁止HTML标签的呈现是否与WTForms中的类的自定义有关,或者必须在GAE的数据存储中专门处理的内容,或者我需要在Flask中修复的内容(例如,模型为帖子).关于我 - 作为一个相对初级的开发者 - 可以将格式化到这些博客文章中的任何明确解决方案都能获得丰厚的回报.来自以下应用的具体代码......
注意:还有一个Flask-Markdown扩展,但我同样不确定如何集成它以实现我想要的效果.
我在Google App Engine上运行Flask(当然还有Jinja模板/ Werkzeug路由),并且对于如何将WYSIWYG编辑器集成到我专门用于博客帖子的页面感到困惑...
我假设,如果合并TinyMCE,JavaScript的调用将放在模板的标题中......就像这样:
<script type="text/javascript" src="/static/js/tiny_mce/tiny_mce.js">
Run Code Online (Sandbox Code Playgroud)
<textarea cols="80" rows="10" id="articleContent" name="articleContent">
<h1>Article Title</h1>
<p>Here's some sample text</p>
</textarea>
<script type="text/javascript">
tinyMCE.init({
theme : "advanced",
theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "left",
mode : "exact",
elements : "articleContent"
});
</script>
Run Code Online (Sandbox Code Playgroud)
<label for="title">{{ form.title.label }}</label>
{{ form.title|safe }}
{% …Run Code Online (Sandbox Code Playgroud) 我想我已经阅读了几乎所有关于签名的base-64编码的内容,用于浏览器内,基于表单的帖子到S3:旧文档和新文档.例如:
http://doc.s3.amazonaws.com/proposals/post.html
甚至发现了这个:
http://s3.amazonaws.com/doc/s3-example-code/post/post_sample.html
我没有使用上面或亚马逊的新策略生成器,也没有使用Boto,我试图草拟一个更简单的.py脚本,它从明文文件(policy.txt)中提取策略JSON,然后生成必要的基础 - 64位编码签名,帮助我起草HTML表单.
签名本身(依赖于编码策略)未被正确编码...可能是由于某种utf-8与ascii或\n(换行)问题?
我正在使用的脚本如下,策略和AWS Secret Key private_key来自我正在使用的AWS测试用例,以查看此脚本是否有效.正确编码的签名 - 由亚马逊引用 - 包含在下面的脚本中以供参考.
谁能告诉我为什么下面计算的签名与亚马逊提供的参考签名不符?
换一种说法:
为什么这是正确编码的:
policy_encoded = base64.b64encode(policy)
Run Code Online (Sandbox Code Playgroud)
但这个不是:
signature = base64.b64encode(hmac.new(private_key, policy_encoded, sha).digest())
Run Code Online (Sandbox Code Playgroud)
PYTHON签名计算器......
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import base64, hmac, sha
from sys import argv
script, policy = argv
private_key = 'uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o'
input = open("..Desktop/policy.txt", "rb")
policy = input.read()
policy_encoded = base64.b64encode(policy)
signature = base64.b64encode(hmac.new(private_key, policy_encoded, sha).digest())
print "Your policy base-64 encoded is %s." % (policy_encoded)
print "Your signature base-64 …Run Code Online (Sandbox Code Playgroud) 我有一个"标记"元组列表...每个元组都是(tag_id,value)...就像这样:
my_list = [(tag_A, 100), (tag_A, 200), (tag_A, 300), (tag_A, 400), (tag_B, 400), (tag_B, 600)]
Run Code Online (Sandbox Code Playgroud)
我想用相同的标签将每个元组的值相加...这样:
sum_of_all_values_with_tag_A() = 1000
sum_of_all_values_with_tag_B() = 1000
Run Code Online (Sandbox Code Playgroud)
我无法想出一个简单的Pythonic方法.
sum(set(value for tag_id, value in my_list))
Run Code Online (Sandbox Code Playgroud)
...返回所有值的总和.
我想我可以使用for或while循环来包装它,这样只有那个带有我想要求和的标签的元组被这个表达式触及......?我需要将与两个标签相关联的值相加...得到两个不同的总数,如上所述区分.但是对于这样的事情,不能完全理解一种优雅的语法.
这发生在预先存在的功能内部.没有嵌套功能就可以做到这一点.
任何建议表示赞赏!