小编big*_*ose的帖子

用io.TextIOWrapper包装一个开放的流

如何打开一个开放的二进制流 - 一个Python 2 file,一个Python 3 io.BufferedReader,io.BytesIO一个io.TextIOWrapper

我正在尝试编写将保持不变的代码:

  • 在Python 2上运行.
  • 在Python 3上运行.
  • 使用从标准库生成的二进制流(即我无法控制它们的类型)
  • 使用二进制流进行测试双精度(即没有文件句柄,无法重新打开).
  • 生成io.TextIOWrapper包装指定流的包.

io.TextIOWrapper是必需的,因为它的API是标准库的其他部分所期望的.存在其他类似文件的类型,但不提供正确的API.

将二进制流包装为subprocess.Popen.stdout属性:

import subprocess
import io

gnupg_subprocess = subprocess.Popen(
        ["gpg", "--version"], stdout=subprocess.PIPE)
gnupg_stdout = io.TextIOWrapper(gnupg_subprocess.stdout, encoding="utf-8")
Run Code Online (Sandbox Code Playgroud)

在单元测试中,流被io.BytesIO实例替换以控制其内容,而不触及任何子进程或文件系统.

gnupg_subprocess.stdout = io.BytesIO("Lorem ipsum".encode("utf-8"))
Run Code Online (Sandbox Code Playgroud)

这适用于Python 3标准库创建的流.但是,相同的代码在Python 2生成的流上失败:

[Python 2]
>>> type(gnupg_subprocess.stdout)
<type 'file'>
>>> gnupg_stdout = io.TextIOWrapper(gnupg_subprocess.stdout, encoding="utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'file' object has …
Run Code Online (Sandbox Code Playgroud)

python unit-testing character-encoding python-2.x python-3.x

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

客户端检测HTTP请求方法

是否可以从JavaScript检测页面的HTTP请求方法(例如GET或POST)?如果是这样,怎么样?

javascript http-headers

31
推荐指数
4
解决办法
2万
查看次数

对HTTP POST请求的正确响应是什么?

对于POST方法,W3规范说:

如果在源服务器上创建了资源,则响应应该是201(已创建)并包含描述请求状态的实体,并引用新资源和Location头(请参阅第10.4节).

http://www.ietf.org/internet-drafts/draft-ietf-httpbis-p2-semantics-05.txt(8.5节)

标准响应实际上似乎是将重定向发送到新创建的资源.

我正在使用ASP.NET MVC构建我的站点,并尝试遵循规范,因此创建了一个ResourceCreatedResult类:

public class ResourceCreatedResult : ActionResult
{
    public string Location { get; set; }
    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.Clear();
        context.HttpContext.Response.StatusCode = 201;
        context.HttpContext.Response.ClearHeaders();
        context.HttpContext.Response.AddHeader("Location", Location);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的行为看起来像这样:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreateNew(string entityStuff)
{
    Entity newEntity = new Entity(entityStuff);
    IEntityRepository entityRepository = ObjectFactory.GetInstance<IEntityRepository>();
    entityRepository.Add(newEntity);

    ActionResult result = new ResourceCreatedResult()
        { Location = Url.Action("Show", new { id = newEntity.Id }) };
    return result;
}
Run Code Online (Sandbox Code Playgroud)

但是,IE,Firefox和Chrome都无法重定向到新资源.我是否搞砸了生成正确的响应,或者网络浏览器不期望这种类型的响应,而是依靠服务器发送重定向响应?

asp.net-mvc http http-headers

31
推荐指数
3
解决办法
4万
查看次数

在HTTP Basic Auth用户名中损坏了UTF-8字符

我正在尝试使用Ruby on Rails构建Web服务.用户通过HTTP Basic Auth进行身份验证.我想在用户名和密码中允许任何有效的UTF-8字符.

问题是浏览器在将它们发送到我的服务之前在基本身份验证凭据中修改了字符.为了测试,我使用'カタカナカタカナカタカナカタカナカタカナカタカナカタカナカタカナカタカナカタカナ'作为我的用户名(不知道它意味着什么 - AFAIK它是我们的QA家伙想出的一些随机字符 - 请原谅我,如果它有点冒犯).

如果我把它看作一个字符串,并做username.unpack("H*")将其转换为十六进制,我得到:"3e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a8"这似乎是对适合32个汉字字符(3个字节元/ 6个十六进制数字).

如果我使用通过HTTP Basic auth进入的用户名执行相同的操作,我会得到:'bafbbaacbafbbaacbafbbaacbafbbaacbafbbaacbafbbaacbafbbaacbafbbaac'.它显然要短得多.使用Firefox Live HTTP Headers插件,这是发送的实际标头:

Authorization: Basic q7+ryqu/q8qrv6vKq7+ryqu/q8qrv6vKq7+ryqu/q8o6q7+ryqu/q8qrv6vKq7+ryqu/q8qrv6vKq7+ryqu/q8o=
Run Code Online (Sandbox Code Playgroud)

看起来像'bafbba ...'字符串,高低字节交换(至少当我将其粘贴到Emacs中时,基本64解码,然后切换到hexl模式).这可能是用户名的UTF16表示,但我没有任何东西可以将其显示为除了胡言乱语之外的任何东西.

Rails将内容类型标头设置为UTF-8,因此浏览器应该以该编码发送.我获得了表单提交的正确数据.

问题出现在Firefox 3.0.8和IE 7中.

那么......是否有一些神奇的功能让网络浏览器通过HTTP Basic Auth发送UTF-8字符?我在接收端处理错误了吗?HTTP Basic Auth是否不适用于非ASCII字符?

ruby-on-rails http utf-8 http-headers

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

文本格式错误:字符串格式说明符中不允许'='对齐

'=' alignment以下错误消息中的含义是什么,为什么此代码会导致错误消息?

>>> "{num:03}".format(num="1")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: '=' alignment not allowed in string format specifier
Run Code Online (Sandbox Code Playgroud)

代码有一个微妙的问题:输入值"1"是文本,而不是数字.但错误消息似乎与此无关.

错误消息中没有任何内容表明为什么"'='alignment"是相关的,并且它不会出现在代码中.那么发出错误信息的意义是什么?

python string-formatting

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

PHP/Curl:HEAD请求在某些站点上需要很长时间

我有一个简单的代码,可以对URL执行头请求,然后打印响应头.我注意到在某些网站上,这可能需要很长时间才能完成.

例如,请求http://www.arstechnica.com大约需要两分钟.我使用另一个执行相同基本任务的网站尝试了相同的请求,并立即返回.所以我必须设置错误导致这种延迟的东西.

这是我的代码:

$ch = curl_init();
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt ($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);

// Only calling the head
curl_setopt($ch, CURLOPT_HEADER, true); // header will be at output
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); // HTTP request is 'HEAD'

$content = curl_exec ($ch);
curl_close ($ch);
Run Code Online (Sandbox Code Playgroud)

以下是指向具有相同功能的网站的链接:http://www.seoconsultants.com/tools/headers.asp

上面的代码,至少在我的服务器上,需要两分钟才能检索到www.arstechnica.com,但上面链接中的服务会立即返回.

我错过了什么?

php performance curl header http-headers

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

广度优先搜索和深度优先搜索

任何人都可以通过它的实现提供一个关于BFS和DFS的简单解释的链接吗?

algorithm search

24
推荐指数
4
解决办法
3万
查看次数

在python中使用反斜杠(不要逃避)

import os
path= os.getcwd()
final= path +'\xulrunner.exe ' + path + '\application.ini'
print final
Run Code Online (Sandbox Code Playgroud)

我想要出局:

c:\ python25\xulrunner.exe c:\ python25\application.ini

我不希望反斜杠作为字符串工作,我的意思是不要让它逃脱或做任何特别的事情.但我得到一个错误

无效\ x转义

我如何使用'\'作为'\'而不是逃避?

python string backslash

23
推荐指数
3
解决办法
6万
查看次数

Grails文件下载

我正试图让一个允许用户上传他们喜欢的任何文件类型的网站.我已经很好地实现了这个功能,并且文件保存在服务器上.稍后他们可以下载文件进行查看,但我无法让它工作.

我已经使用了我可以掌握的任何示例,但他们都倾向于使用文本文件作为示例.我的问题是pdf和许多其他文件类型没有正确下载.它们似乎下载得很好,但没有一个文件会成功打开.比较文件,似乎大多数文件内容是正确的,但某些部分不是.

这是我的常规代码:

def file = new File(params.fileDir)    
response.setContentType("application/octet-stream")
response.setHeader("Content-disposition", "filename=${file.getName()}")
response.outputStream << file.text
return
Run Code Online (Sandbox Code Playgroud)

此代码保存在由下载链接调用的控制器内.我尝试过使用不同的contentTypes,但我不知道哪种类型可以使用 - 有一个吗?我尝试的任何东西都无法解决问题.

谢谢你的帮助.

grails spring attachment download http-headers

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

如何防止ssh-keygen在公钥中使用我的登录名和计算机名?

ssh-keygen在OS X上运行,当我显示生成的公钥时,我看到我的登录名和机器名出现在密钥的最后部分.有没有办法让它使用不同的值或根本不使用它?

ssh customization

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