小编haw*_*ett的帖子

有效的javascript对象属性名称

我正在尝试找出对javascript对象的属性名称有效的内容.例如

var b = {}
b['-^colour'] = "blue";     // Works fine in Firefox, Chrome, Safari
b['colour'] = "green";      // Ditto
alert(b['-^colour']);       // Ditto
alert(b.colour);            // Ditto
for(prop in b) alert(prop); // Ditto
//alert(b.-^colour);     // Fails (expected)
Run Code Online (Sandbox Code Playgroud)

这篇文章详细介绍了有效的javascript变量名称,' - ^ color'显然无效(作为变量名).这同样适用于对象属性名称吗?看看上面我试图解决的问题

  1. b [' - ^ color']无效,但可以在所有浏览器中使用quirk,我不应该相信它可以继续工作

  2. b [' - ^ color']是完全有效的,但它只是一种只能以这种方式访问​​的形式 - (它支持所以对象可以用作地图吗?)

  3. 还有别的

顺便说一句,javascript中的全局变量可能会在顶层声明为

var abc = 0;
Run Code Online (Sandbox Code Playgroud)

但也可以创建(据我所知)

window['abc'] = 0;
Run Code Online (Sandbox Code Playgroud)

以下适用于所有上述浏览器

window['@£$%'] = "bling!";
alert(window['@£$%']);
Run Code Online (Sandbox Code Playgroud)

这有效吗?它似乎与变量命名规则相矛盾 - 或者我不是在那里声明变量?变量和对象属性名称之间有什么区别?

javascript

68
推荐指数
3
解决办法
5万
查看次数

使用OpenID在app引擎中保护remote_api

我以前问一个问题关于使用App Engine的remote_api的使用OpenID,答案运作良好,既安全,不安全.然而,在不久之后的某个时刻,应用程序引擎中的某些内容发生了变化,解决方案不再安全地运行 - 即以下内容

remote_api_stub.ConfigureRemoteDatastore(app_id=app_id, path='/remote_api', auth_func=auth_func, servername=host, secure=True)
Run Code Online (Sandbox Code Playgroud)

停止工作(总是返回302),我需要删除安全参数才能使其工作.

1.3.5 SDK发布承诺"远程API命令可以通过HTTPS或HTTP发送",这让我很困惑,因为我认为提供'secure = True'论证已经给了我这个,基于这个讨论.

我怀疑是这个功能的发布导致"安全"论点停止工作.所以我的问题的第一部分 - 我是否在1.3.5发布之前使用'secure = True'参数安全地运行remote_api命令?

一旦cookie hack安全地停止工作,我尝试了在同一个问题中列出的Nick Johnson的解决方案,但同样,我也无法提供'secure = True',获得相同的302响应.

使用openID安全地运行remote_api需要做什么?1.3.5是否包含围绕此功能的新功能,以及如何使用它们?干杯,

科林

openid google-app-engine

42
推荐指数
1
解决办法
1812
查看次数

python exec()中的全局变量和本地变量

我正在尝试使用exec运行一段python代码.

my_code = """
class A(object):
  pass

print 'locals: %s' % locals()
print 'A: %s' % A

class B(object):
  a_ref = A
"""

global_env = {}
local_env = {}
my_code_AST = compile(my_code, "My Code", "exec")
exec(my_code_AST, global_env, local_env)

print local_env
Run Code Online (Sandbox Code Playgroud)

这导致以下输出

locals: {'A': <class 'A'>}
A: <class 'A'>
Traceback (most recent call last):
  File "python_test.py", line 16, in <module>
    exec(my_code_AST, global_env, local_env)
  File "My Code", line 8, in <module>
  File "My Code", line 9, in B
NameError: name 'A' is …
Run Code Online (Sandbox Code Playgroud)

python scope

35
推荐指数
2
解决办法
3万
查看次数

动态加载less.js规则

我正在考虑少用.js(看起来很棒),但我们的网站要求在初始页面加载后动态加载某些样式.但是,似乎必须在less.js脚本加载之前加载所有LESS样式表.即这是有效的

<link rel="stylesheet/less" href="/static/less/style.less"/>
<script src="http://lesscss.googlecode.com/files/less-1.0.30.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

但如果换行,它会失败,firefox和chrome都不会尝试加载'style.less',除非它们被正确排序.本教程中明确指出了排序要求.

有没有办法在初始页面加载后加载较少的样式表?

请注意,此博客描述了"观看"功能 -

这将在您保存LESS代码时自动刷新CSS

因此,期望我可以在页面加载后添加一些LESS规则似乎是合理的.感觉就像我错过了一些东西.

干杯,

科林

更新:用于测试注释中描述的行为的代码(脚本后列出的样式表更少) -

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Simple</title>

  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
  <script src="/static/js/less-1.0.31.min.js"></script> 
  <link rel="stylesheet/less" href="/static/less/style.less" id="abc123"/>
</head>
<body>
  <div id="container">
    <div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
  </div>
  <div id="#abc">Bingo</div>
</body>

<script>
console.log("refreshing styles...");
less.sheets.push(document.getElementById('abc123'));
//var lessStyle = $("<style>#abc { color: blue; }</style>").attr("id", "less:static-less-style").attr("type", 'text/less');
//$("head").append(lessStyle);
less.refresh(true);
console.log("refreshed...");
</script>
</html>
Run Code Online (Sandbox Code Playgroud)

和较少的样式表 …

javascript css less

25
推荐指数
2
解决办法
3万
查看次数

当应用程序引擎变慢时会更昂贵吗?

最近有很多次应用引擎运行速度变慢.在某种程度上,云平台的架构可以理解.我不是在讨论新的服务器实例 - 只是要求加热服务器.我也只是指CPU,而不是数据存储API,但我也很想知道.

似乎在这些缓慢的时期我收到了更多关于我的请求的黄色警告 - 说我使用了大量的CPU.当然,在此期间他们需要更长时间才能完成.我担心的是,在这些缓慢的时期,我的计费 CPU似乎上升了.

所以要清楚 - 当app引擎很快时,请求可能会在100ms内完成.在缓慢的时间段内,同一请求可能需要超过1秒.相同的URI,相同的缓存,相同的处理路径,相同的数据存储,相同的索引 - 更多的CPU.根据我的理解,黄色警告指的是可计费的CPU使用率,当app引擎速度较慢时,还有更多的警告.

这似乎设置了一个奇怪的情况,当应用程序引擎性能更差时,我的应用程序运行成本更高.这意味着谷歌赚的钱越多,平台的表现越差(直到失败或客户离开的程度).也许我的情况完全错了,它不会那样 - 但如果它确实像那样工作,那么作为客户,压力和平衡都是错误的.这并没有暗示谷歌的任何错误行为 - 只是这两件事之间的关系似乎并不合适.

谷歌的算法似乎就像 - "如果我给CPU处理一个处理工作并启动我的手表,那么当工作返回时就停止它我得到可计费的CPU数字." 即它根本不测量CPU工作.当然应该将时间除以同时执行的处理作业的数量加上一些额外的时间来覆盖额外的上下文切换.我确信这些东西很难衡量 - 也许这就是原因.

我猜你可以说当你的应用程序引擎需求量很大时支付更多是公平的,但是这使得预算几乎不可能 - 你不能生成像"100个用户每天花费我1美元"这样的统计数据,因为这可能会改变各种各样的原因 - 包括应用引擎入门的客户比基础设施可以实际处理的客户多.如果谷歌过度订阅应用引擎,那么所有客户支付更多 - 这是另一种听起来不正确的关系.当然谷歌的成本应该降低,因为他们板载更多的客户,这些客户使用更多的资源-基于规模经济.

我应该期望我的应用程序中的两个相同的请求每次运行时花费我大致相同的金额 - 无论壁挂式应用程序引擎需要多少实际完成它们?我误解了它是如何工作的吗?如果我没有,那么从长远来看,我不应该担心它吗?是否有一些文件使这种情况更清楚?干杯,

科林

google-app-engine

20
推荐指数
1
解决办法
906
查看次数

App Engine:400 - 您的客户发出了格式错误或非法的请求

在过去的3到4周内,我一直在遇到此错误,向app引擎发出请求.某些请求 - 特别是HTTP DELETE请求,从谷歌服务器返回此错误.

其他人报告了同样的错误 - 我可以找到3个结果

  1. 它是由过时的cookie引起的 - 清除你的cookie并运行良好的gmail帮助 -
  2. 它是由格式错误的网址引起的 - 只有我能找到的与urlfetch()相关的案例 - 网址中的空格 - App引擎组#1,App Engine组#2
  3. 没有决议 - 零星的behaiour,IE只.App Engine Group#3,App Engine Group#4

我现在在每个浏览器中都会一直得到这种行为.我可以完全清除Chrome,Firefox,Safari中的缓存/ cookie等,重新启动浏览器并仍然可靠地在相同的请求中得到此错误,因此我认为其cookie不相关.在任何情况下,我都可以发出GET,POST和PUT请求同一个cookie没问题.

鉴于它在特定的DELETE请求中可靠地发生,格式错误的URL看起来最有可能,但是我的URL非常简单,并且在开发服务器上工作正常

Firebug将请求标题显示为(我已经将密钥包含在内,因为它们包含标识数据,但是通过从密钥中心删除字符来实现这一点 - 不是为了保证我不会无意中删除任何前导或尾随空格)

    Request URL:http://my-app.appspot.com/agprhcjgLEgVLbm93dCItX0RrbV9Ea25vd3RfbmV0X19wccxDA/Task.xml
    Request Method:DELETE
    Status Code:400 Bad Request

    Request Headers
    Accept:*/*
    Cache-Control:max-age=0
    Content-Type:application/x-www-form-urlencoded
    Origin:http://my-app.appspot.com
    Referer:http://my-app.appspot.com/
    User-Agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4
    X-Requested-With:XMLHttpRequest

    Form Data
    entity_key:agprdC1hcjYLEgVLbm93dCIrX09Ea25vd3RfbmV0X19wMQw

    Response Headers
    Content-Length:1350
    Content-Type:text/html; charset=UTF-8
    Date:Fri, 30 Jul …
Run Code Online (Sandbox Code Playgroud)

google-app-engine

17
推荐指数
2
解决办法
3万
查看次数

AjaxForm和app引擎blobstore

我在AjaxForm文件上传和应用程序引擎blobstore方面遇到了一些困难.我怀疑难度是因为blobstore上传处理程序(blobstore_handlers.BlobstoreUploadHandler的子类)要求重定向响应,而不是返回任何内容,但我不确定.我期待得到一个XML文档,它似乎按预期到达浏览器,但我无法掌握它 - 详情如下.

我的app引擎blobstore上传处理程序如下 -

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
  def post(self):
    upload_files = self.get_uploads('file')  # 'file' is file upload field in the form
    blob_info = upload_files[0]

    entity_key = self.request.get("entityKey")

    // Update a datastore entity with the blobkey (not shown)

    // redirect to the uri for the updated entity
    self.redirect('%s.xml' % entity_key)
Run Code Online (Sandbox Code Playgroud)

最后的重定向是我的应用程序中的uri,它返回一个xml文档.查看服务器输出,没有迹象表明出现任何问题 - 重定向已得到服务,并且按预期返回xml文档,并使用正确的mime类型 - 因此表单提交看起来很好,服务器对该提交的响应看起来很好好.

我的客户端代码使用ajaxForm看起来如下(对不起它有点迟钝,我不认为问题在这里) -

// Create the form
var dialogForm = $("<form method='POST' enctype='multipart/form-data'>")
   .append("<span>Upload File: </span><input type='file' name='file'/><br>")
   .append("<input type='hidden' name='entityKey' value='" + entityKey + …
Run Code Online (Sandbox Code Playgroud)

jquery google-app-engine ajaxform

16
推荐指数
1
解决办法
2410
查看次数

多条匹配路线

我有一个定义两个控制器的backbone.js应用程序,控制器都定义了与location.hash匹配的路由模式.我无法解决这两个问题 - 例如

ManagerController = Backbone.Controller.extend({
   routes: {
      ":name":      "doStuff"
   },

   doStuff : function(name) {
      console.log("doStuff called...");
   }
});

Component1Controller = Backbone.Controller.extend({
   routes: {
      "xyz123":      "doMoreStuff"
   },

   doMoreStuff : function() {
      console.log("doMoreStuff called...");
   }
});
Run Code Online (Sandbox Code Playgroud)

所以如果url是"http://mysite.com/#xyz123",那么我看到'doStuff()'被调用,或者如果我注释掉那条路线,那么调用'doMoreStuff()'.但不是两个.

我正在使用这种架构,因为我的页面是高度面向组件的,每个组件都定义了自己的Controller."组件管理器"还定义了一个控制器,它在所有路径上进行一些管理.

我是否应该能够配置两个响应相同路由的控制器?干杯,

科林

backbone.js

12
推荐指数
2
解决办法
1万
查看次数

带有OpenID的App Engine remote_api

我最近尝试将我的应用引擎应用切换为使用openID,但我遇到了使用remote_api进行身份验证的问题.remote_api的旧身份验证机制似乎不起作用(这是有道理的) - 我得到一个'urllib2.HTTPError:HTTP错误302:找到',我假设是appengine将我重定向到openid登录页面我已经建立.

我想我错过了一些相当明显的东西.目前我的remote_api脚本中包含以下内容 -

remote_api_stub.ConfigureRemoteDatastore(app_id=app_id, path='/remote_api', auth_func=auth_func, servername=host, secure=secure)
Run Code Online (Sandbox Code Playgroud)

其中auth_func是

def auth_func():
  return raw_input('Username:'), getpass.getpass('Password:')
Run Code Online (Sandbox Code Playgroud)

有什么想法我需要提供给remote_api吗?我猜也是会遇到与bulkloader类似的问题.干杯,

科林

openid google-app-engine

10
推荐指数
1
解决办法
2524
查看次数

less.js懒惰的纸张装载

我想知道是否有一种方法可以在页面加载后的某个时间加载一张更少的工作表. 这个问题有一个解释如何重新加载所有工作表的答案,但对于我的用例,现有的工作表从不依赖于新加载的工作表,并且最好只是懒惰地添加工作表.我在想类似的东西

less.sheets.push(mySheet);
less.loadStyleSheet(mySheet);
Run Code Online (Sandbox Code Playgroud)

可能代表一个可能的API?干杯,

科林

更新2010年12月3日:

我已经尝试了Livingston Samuel对less.js代码库的修复,虽然它确实有效,但它似乎无法识别已经加载的样式表中的定义.这是我的示例文件

一个.的index.html

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>Simple</title>

  <link rel="stylesheet/less" href="/static/less/style.less" id="abc123"/>
  <script src="/static/js/less-1.0.40.js"></script> 
</head>
<body>
  <div id="container">
    <div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
  </div>
  <div id="abc"><div>Bingo</div></div>
</body>

<script>
console.log("loading new sheet");
less.loadStyleSheet("/static/less/style2.less", function() {
    console.log("Loaded!"); 
});

console.log("called");

</script>
</html>
Run Code Online (Sandbox Code Playgroud)

湾 style.less

@primary_color: green;

.rounded(@radius: 5px) {  
  -moz-border-radius: @radius;  
  -webkit-border-radius: @radius;  
  border-radius: @radius;  
}

#container {
  background: @primary_color;
  .rounded(5px);

  div { …
Run Code Online (Sandbox Code Playgroud)

javascript less

10
推荐指数
2
解决办法
3762
查看次数

是否应该订购动态脚本?

<script>在页面加载后动态地向head元素添加了一些标签.我理解脚本是异步加载的,但是我可以期望它们按照添加的顺序进行解析吗?

我在Firefox中看到了预期的行为,但在Safari或Chrome中却没有.查看Chrome开发人员工具和Firebug中的文档,两者都显示以下内容 -

<html>
  <head>
    ...
    <script type="text/javascript" src="A.js"></script>
    <script type="text/javascript" src="B.js"></script>
  </head>
  ...
</html>
Run Code Online (Sandbox Code Playgroud)

但是,在查看资源加载视图时,chrome似乎会解析从服务器首先返回的任何一个,而firebug总是按照添加脚本标记的顺序加载它们,即使首先从服务器返回B也是如此.

我是否希望Chrome/Safari按指定顺序解析文件?在OS X 10.6.3上使用Chrome 5.0.375.29 beta

编辑(10/5/10):当我说解析时,我的意思是执行 - 可以看到积极解析的许多好处 - thx rikh

编辑(11/5/10):好的,所以我按照下面的juandopazo的说法进行了测试.但是我添加了一些东西,包括

  1. 使用javascript直接将脚本元素添加到头部.(测试A - > D)
  2. 使用jquery的append()方法将脚本元素添加到头部.(测试E - > H)
  3. 使用jquery的getScript()方法"加载"脚本.(测试I - > L)

我还尝试了脚本标签上"async"和"defer"属性的所有组合.

您可以在此处访问测试 - http://dyn-script-load.appspot.com/,并查看源代码以了解其工作原理.加载的脚本只需调用update()函数.

首先要注意的是,只有上述第一和第三种方法并行运行 - 第二种方法依次执行请求.你可以在这里看到这个图表 -

图1 - 请求生命周期
请求生命周期图表http://dyn-script-load.appspot.com/images/dynScriptGraph.png

有趣的是,jquery append()方法也阻止了getScript()调用 - 你可以看到它们都没有执行,直到所有append()调用完成,然后它们全部并行运行.关于这一点的最后一点是,jQuery append()方法在执行后显然会从文档头中删除脚本标记.只有第一种方法会在文档中保留脚本标记.

Chrome结果

结果是Chrome始终执行第一个要返回的脚本,无论测试如何.这意味着所有测试'失败',除了jQuery append()方法.

图2 - Chrome 5.0.375.29测试结果
Chrome结果http://dyn-script-load.appspot.com/images/chromeDynScript.png

Firefox结果

但是,在firefox上,如果使用第一个方法,并且async为false(即未设置),那么脚本将按顺序可靠地执行.

图3 - FF 3.6.3结果
FF结果http://dyn-script-load.appspot.com/images/ffDynScript.png

请注意,Safari似乎以与Chrome相同的方式提供不同的结果,这是有道理的.

此外,我在慢速脚本上只有500毫秒的延迟,只是为了保持开始 - >结束时间.您可能需要刷新几次才能看到Chrome和Safari在所有内容上都失败了.

在我看来,没有这样做的方法,我们没有利用并行检索数据的能力,并且我们没有理由不应该(如firefox所示).

javascript dynamic-script-loading

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

查找XMLHttpRequest的URL

我有一些代码使用jQuery执行ajax请求,并处理成功和错误条件.如果出错,我想知道我调用的URL是什么,所以我可以记录它.此信息似乎包含在XMLHttpRequest.channel中,但是firefox正在抱怨访问此信息 -

Permission denied for <http://localhost:8081> to get property XMLHttpRequest.channel
Run Code Online (Sandbox Code Playgroud)

有关如何确定与XMLHttpRequest关联的URL的任何想法?掌握这些信息的安全问题是什么?干杯,

科林

javascript jquery

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

OS X AppEngine - ImportError:没有名为_sqlite3的模块

更新:这是我在全新安装的OS X 10.8.3上使用1.8.0 App Engine SDK时遇到的问题.

首先 - 在SO上有一堆关于类似标题的问题.我已经检查过了,我不相信他们回答了我的问题.大多数情况下,他们建议使用libsqlite3-dev并重建python以获取_sqlite3.so,但这已经是应该的位置了:

$ find / -name _sqlite3.so
Password:
...
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-dynload/_sqlite3.so
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload/_sqlite3.so
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_sqlite3.so

导致app引擎SDK尝试加载该模块的实际代码是:


remaining = TaskSetElement.all().filter('taskSet', ts_key).filter('complete', False).count()
Run Code Online (Sandbox Code Playgroud)

这是SDK堆栈跟踪:


  File "~/dev/myApp/myApp/task.py", line 90, in completeTaskSetElement
    remaining = TaskSetElement.all().filter('taskSet', ts_key).filter('complete', False).count()
  File "~/dev/GAE/google_appengine/google/appengine/ext/db/__init__.py", line 2133, in count
    result = raw_query.Count(limit=limit, **kwargs)
  File "~/dev/GAE/google_appengine/google/appengine/api/datastore.py", line 1698, in Count
    batch = self.GetBatcher(config=config).next()
  File "~/dev/GAE/google_appengine/google/appengine/datastore/datastore_query.py", line 2754, in next
    return self.next_batch(self.AT_LEAST_ONE)
  File "~/dev/GAE/google_appengine/google/appengine/datastore/datastore_query.py", line 2791, in next_batch
    batch = self.__next_batch.get_result()
  File "~/dev/GAE/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 604, in get_result
    return …
Run Code Online (Sandbox Code Playgroud)

python google-app-engine

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