小编jaa*_*apz的帖子

_.extend(Something.prototype,someObj)和Something.prototype.someFunc = someFunc有什么区别?

我正在使用JavaScript进入实际的面向对象编程,并且我遇到了两种不同的扩展现有对象原型的方法.

方法一:

Something.prototype.someFunc = function() {
    // To something usefull
}
Run Code Online (Sandbox Code Playgroud)

方法二(使用underscore.js):

_.extend(Something.prototype, {
    someFunc: function() {
        // Do the same but differently
    }
}
Run Code Online (Sandbox Code Playgroud)

这两种方法有什么区别?哪一个被认为"更好"?对我来说,看起来第一种方法更好,因为它使用普通的旧javascript,第二种方法是别人的实现.但另一方面,underscore.js开发人员肯定没有添加_.extend()方法什么都没有?

javascript oop prototype underscore.js

9
推荐指数
1
解决办法
2449
查看次数

Flask-SQLAlchemy和Gevent没有关闭mysql连接

我目前正在使用Flask-uWSGI-Websockets为我的应用程序提供websocket功能.我使用Flask-SQLAlchemy连接到我的MySQL数据库.

Flask-uWSGI-Websockets使用gevent来管理websocket连接.

我目前遇到的问题是,当websocket连接结束时,Flask-SQLAlchemy设置的数据库连接将继续存在.

我试过调用db.session.close()db.engine.dispose()在每个websocket连接之后,但这没有效果.

gevent.monkey.patch_all()在我的应用程序的开头调用并没有什么区别.

我正在做的简单表示是这样的:

from gevent.monkey import patch_all
patch_all()

from flask import Flask
from flask_uwsgi_websocket import GeventWebSocket
from flask_sqlalchemy import SQLAlchemy

app = Flask()
ws = GeventWebSocket()
db = SQLAlchemy()

db.init_app(app)
ws.init_app(app)


@ws.route('/ws')
def websocket(client):
    """ handle messages """
    while client.connected is True:
        msg = client.recv()
        # do some db stuff with the message

    # The following part is executed when the connection is broken,
    # i tried this for removing …
Run Code Online (Sandbox Code Playgroud)

sqlalchemy gevent uwsgi flask-sqlalchemy

7
推荐指数
1
解决办法
882
查看次数

使用TypedChoiceField的FormSet每次~2000次请求都不会强制转换为int

我正在使用一个包含多个表单的FormSet,每个表单都有一个数量字段,其定义如下:

quantity = TypedChoiceField(coerce=int, required=False)
Run Code Online (Sandbox Code Playgroud)

我想知道是否至少有一个数量> 0,所以在我的formset干净,我写这个:

def clean(self):
    if sum([form.cleaned_data['quantity'] for form in self.forms]) == 0:
        raise forms.ValidationError(_('No products selected'))
Run Code Online (Sandbox Code Playgroud)

所以,通常这只是起作用,而form.cleaned_data ['quantity']是一个int(由coerce = int设置).但每隔一段时间(就像每2000次请求这个表格一样),我得到一个例外,告诉我:

TypeError: unsupported operand type(s) for +: 'int' and 'str'
Run Code Online (Sandbox Code Playgroud)

在那一行,这意味着form.cleaned_data ['quantity']是一个字符串,sum()不喜欢求和字符串,所以它抛出一个异常.您可以通过启动python控制台并键入以下内容来自行测试:

>>> sum([u'1', u'2'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'unicode'
>>> 
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,为什么会发生这种情况?还有为什么这种情况很少发生?django文档告诉我,在调用clean()之前,可以保证强制执行TypedChoiceField,因此不应该这样做.

这个bug很难修复,因为它很难重现,所以我希望你们其中一个人遇到类似的问题.

这是在python 2.6和django 1.3.1上.

提前致谢!

编辑 所以这里是堆栈跟踪:

File "****/handlers/products.py" in process
  429.                if formset.is_valid():
File "/usr/local/lib/python2.6/dist-packages/django/forms/formsets.py" in is_valid
  263. …
Run Code Online (Sandbox Code Playgroud)

python django python-2.6 django-forms

5
推荐指数
1
解决办法
820
查看次数

要在未找到的子资源上返回的状态代码

所以假设我有两个资源,Wallet和User.用户和电子钱包具有一对一的关系.在我的REST API中,我提供了一个选项,可以通过ID为用户提供不同的Wallet.因此,将用户移动到其他钱包的典型HTTP PUT请求可能如下所示:

PUT /api/user/3 HTTP/1.1
Host: api.myuserandwalletwebsite.com

{
    "wallet_id": 15
}
Run Code Online (Sandbox Code Playgroud)

这将更新用户以使用id = 15的钱包.但是,如果PUT请求包含在数据库中找不到的wallet_id,该怎么办?那么REST API应该返回什么?只是一个简单的404?

在未找到的子资源上返回404对我来说感觉很奇怪,因为404会产生误导:你可能认为404实际上是指未找到用户.

rest http http-status-codes

4
推荐指数
1
解决办法
3808
查看次数