我希望能够根据我在测试模式下启动django来做条件连接().
在我的settings.py中我使用mongoengine connect()方法连接到我的数据库,但问题是如果我运行manage.py test我不想这样做
有没有什么方法可以检查settings.py是否正在从测试中导入,有些标志可能.
如果不是IN_TESTS:connect()
我正在尝试在我写的django项目中使用MongoEngine.我很难获得(或理解如何)身份验证后端的工作原理.
据我所知,用户对象没有存储在请求中.
我有它工作,但我不确定我是否以正确/安全的方式做到这一点.如果有人能查看我的代码,我将不胜感激.
def login(request):
user = authenticate(request.POST['username'],request.POST['password'])
if user is not None:
request.session['user'] = user
if user.is_authenticated:
return HttpResponse(user)
else:
return HttpResponse('login failed')
def new_page(request):
try:
user = request.session['user']
if user.is_authenticated:
return HttpResponse('welcome')
except:
return HttpResponse('need be logged in')
Run Code Online (Sandbox Code Playgroud)
在我的settings.py中,我已添加到文件的顶部:
AUTHENTICATION_BACKENDS = (
'mongoengine.django.auth.MongoEngineBackend',
)
SESSION_ENGINE = 'mongoengine.django.sessions'
import mongoengine
mongoengine.connect('project')
Run Code Online (Sandbox Code Playgroud) 根据Mongoengine API指南(http://mongoengine-odm.readthedocs.org/en/latest/apireference.html):
class mongoengine.queryset.QuerySet(document, collection)
Run Code Online (Sandbox Code Playgroud)
是" 从查询返回的一组结果.包装MongoDB游标,提供Document对象作为结果. "
当我type()在我的解释器中检查QuerySet对象时,它表示QuerySet对象是a <class 'mongoengine.queryset.QuerySet'>,与API指南一致.
我很困惑,但因为以实际访问个人Mongoengine Document在查询集实例对象,我必须使用索引的方法,如[0](对于第一Document物体)或[2](用于第三Document对象)参见本SO问题关于切片QuerySet.有趣的是,您还可以调用len()QuerySet实例.
即使QuerySet是一个类对象,为什么它看起来像一个列表对象?据我所知,它不会继承UserList,也没有data属性.任何帮助将不胜感激.
谢谢.
编辑:
谢谢你的建议@isbadawi.这很有帮助.QuerySet类对象确实包含__getitem__方法,正如您的链接所暗示的那样,该方法与索引"大致相同"(例如x.__getitem__(i),大致相当于x[i]).因此,如果QuerySet正在模拟列表类__getitem__,那么实际的Document对象存储在类中的哪个位置?在一个属性?这是dir(QuerySet)我的翻译中的输出:
> ['_QuerySet__already_indexed', '_QuerySet__dereference', '__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__iter__', '__len__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_as_pymongo', '_as_pymongo_coerce', '_build_index_spec', '_class_check', '_collection', '_collection_obj', '_cursor', '_cursor_args', …Run Code Online (Sandbox Code Playgroud) 我有一个小的Flask应用程序,它呈现博客文章:
views.py:
class ListView(MethodView):
def get(self, page=1):
posts = Post.objects.all()
return render_template('posts/list.html', posts=posts)
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但我想为posts对象添加分页.看一下项目文档,我看到有一个分页类.
所以我尝试了这个:
class ListView(MethodView):
def get(self, page=1):
posts = Post.objects.paginate(page=page, per_page=10)
return render_template('posts/list.html', posts=posts)
Run Code Online (Sandbox Code Playgroud)
但现在我收到一个错误:
TypeError: 'Pagination' object is not iterable
Run Code Online (Sandbox Code Playgroud)
那么如何posts在模板中迭代我?
任何帮助非常感谢.
在Mongoengine 0.7.10中,我仍然可以做以下事情:
class User(db.Document):
email = db.EmailField(unique=True, required=True)
_password = db.StringField(max_length=255, required=True)
@property
def password(self):
return self._password
@password.setter
def password(self, password):
self._password = bcrypt.generate_password_hash(password)
user = User(email='1@1.com', password='12345')
Run Code Online (Sandbox Code Playgroud)
但是,上面的代码在0.8.0中断:
ValidationError: ValidationError (User:None) (_password.Field is required: ['User'])
似乎MongoEngine在启动期间无法识别我的自定义密码设置器.我必须手动编写这些来修复它:
user = User(email='1@1.com')
user.password='12345'
Run Code Online (Sandbox Code Playgroud)
这可能是由于以下变化(来自Mongonengine 0.8升级说明):
Previously, if you had data the database that wasn’t defined in the Document definition, it would set it as an attribute on the document. This is no longer the case and the data is set …
我正在尝试使用MongoEngine连接到MongoDB副本集?我想连接到任何可用的辅助服务器.
我只能找到pyMongo的例子.有帮助吗?
我正在努力优化(主要)由MongoDB支持的Django应用程序.它在负载测试下死亡.在当前有问题的页面上,New Relic显示了700多个来电pymongo.collection:Collection.find.大部分代码都是由初级编码员编写的,通常我会寻找添加标记,进行更智能连接和删除循环以减少查询调用的地方,但这里不能选择连接.我做了什么(在添加基于EXPLAINs的指标之后)尝试通过进行一般查询然后在循环中过滤那个较小的集合来降低循环中的成本.虽然我已经从900个查询中得到了这个数字,但即使在页面上进行了大量的工作,700仍然看起来很疯狂.我想甚至可能find在过滤现有的查询集时被调用,但代码表明它始终是数据库查询.
我已经添加了一些日志记录到mongoengine来查看查询来自哪里以及查看EXPLAIN语句,但是我没有大量的运气来筛选信息.mongoengine本身似乎是性能问题的一部分:我转而使用mongomallard作为测试,并在页面上获得了50%的性能提升.不幸的是,我得到了很多其他的页面上的错误(尽我可以告诉它过滤现有查询集时,会出现野鸭做得不好;错误抱怨的电话deepcopy这是发生在一台发电机,你不能做 - 我在那里打了一堵砖墙.虽然Mallard对我们来说似乎不是一个可行的替代品,但它确实表明在mongoengine中将很多时间用于将对象转换为Python和从Python转换对象.
我该怎么做才能进一步减少通话?或者我是否专注于错误的事情,应该在其他地方攻击问题?
编辑:提供一些代码/模型
相关页面显示课程的教学大纲,显示课程中的所有模块,课程和课程中的概念.对于每个概念,还显示了用户在概念中的进展.所以有很多循环来使层次结构变得清晰(并且它不是根据Mongo文档建议的任何模式存储的).
class CourseVersion(Document):
...
course_instances = ListField(ReferenceField('CourseInstance'))
courseware_containers = ListField(EmbeddedDocumentField('CoursewareContainer'))
class CoursewareContainer(EmbeddedDocument):
id = UUIDField(required=True, binary=False, default=uuid.uuid4)
....
courseware_containers = ListField(EmbeddedDocumentField('self'))
teaching_element_instances = ListField(StringField())
Run Code Online (Sandbox Code Playgroud)
课程的模块,课程和概念存储在courseware_containers; 我们需要获取所有概念,以便我们可以获取id列表teaching_element_instances以找到用户已经处理过的最新的概念(如果有的话),然后查找他们的进度.
*为了清楚起见,我正在使用一个分析器并查看时间和行为方式正确的方式我知道,不仅仅是改变事物,希望最好.
嗨所以我在mongo中使用mongoengine测试数据用于存储用户的购物车:
{
"_id" : ObjectId("55e492ac516ddc17a8b07d2a"),
"user" : ObjectId("55e3f236516ddc78296968be"),
"items" : [
{
"item" : ObjectId("55e24cd6516ddcbdc081842b"),
"quantity" : 2,
"added_date" : ISODate("2015-08-31T17:44:49.023Z")
},
{
"item" : ObjectId("55e24cd6516ddcbdc0818425"),
"quantity" : 3,
"added_date" : ISODate("2015-08-31T17:44:49.025Z")
},
{
"item" : ObjectId("55e24cd6516ddcbdc0818420"),
"quantity" : 3,
"added_date" : ISODate("2015-08-31T17:44:49.026Z")
}
]
}
Run Code Online (Sandbox Code Playgroud)
这里的模型:
class CartItem(mongoengine.EmbeddedDocument):
item = mongoengine.ReferenceField('Item')
quantity = mongoengine.IntField()
added_date = mongoengine.DateTimeField(default=datetime.now())
class Cart(mongoengine.Document):
user = mongoengine.ReferenceField('User')
items = mongoengine.EmbeddedDocumentListField(CartItem)
Run Code Online (Sandbox Code Playgroud)
在这里,我将项目存储在用户的购物车中.现在我想获取项目列表字段中的所有唯一项目,因为会有重复的项目.
我执行以下查询来获取项目:
cart = Cart.objects.filter(user=user).first()
queryset = cart.items
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我认为我必须对项目进行分组,我尝试在过滤器中使用原始查询:cart.items.filter(__raw__...) 但这不起作用,因为在这种情况下不支持raw.有人可以帮助我如何做到这一点?谢谢!
我是django世界的新手,我尝试用一些例子将它与mongodb一起使用.要连接到mongo,我使用的是mongoengine 0.9.0.我也在使用virtualenv.
目前我有非常基本的东西,我能够运行服务器,但当我尝试可视化网页时,我收到此错误:
'TopLevelDocumentMetaclass' object is not iterable.
Run Code Online (Sandbox Code Playgroud)
我正在检查具有类似"对象不可迭代"的其他条目,但大多数是使用models.py的用户模型,我的是在sites.py中,目前我不想修改它直到我知道我在做什么:S
这是我的安装包:
我的models.py看起来像这样
from mongoengine import *
from mongoengine import connect
connect('mydatabase')
class Restaurant(Document):
name = StringField(max_length=200)
Run Code Online (Sandbox Code Playgroud)
我在views.py文件中唯一的视图就是这个
def admin(request):
html = "<html><body>Proyecto de ejemplo</body></html>"
return HttpResponse(html)
Run Code Online (Sandbox Code Playgroud)
如果我不在我的Models.py中使用mongoengine而是使用django.db中的模型它可以正常工作,所以我认为问题的原因应该是使用mongoengine.
有谁知道如何解决这个问题?
我花了很多年的时间试图找到一个简单的例子,其中使用了MongoEngine并且关闭了连接.终于想出来并发布了我的代码.
mongoengine ×10
python ×7
mongodb ×6
django ×5
class ×1
connection ×1
disconnect ×1
flask ×1
list ×1
pymongo ×1
replicaset ×1
unit-testing ×1