小编Tom*_*Tom的帖子

在现代浏览器中上传文件的最佳方式是什么?

我想将(单个)文件上传到服务器并显示上传的进度.

我知道我可以使用HTTP POST上传文件.我不熟悉网络套接字,但据我所知,二进制数据也可以通过这种方式发送,因为websockets是双向的,我可以获得上传的进度.

我不担心旧浏览器,所以iframe和flash解决方案不是很吸引人,除非在这条路线上有显着的优势.

我也很好奇最好的服务器端技术.使用像Django这样的wsgi服务器有什么好处?或者像Node.js这样的非阻塞I/O技术?我不是在问web框架x是否优于web框架y,或者服务器x是否优于服务器y.但只是理想的技术应该具有什么才能在客户端设置上传.

更新:服务器端似乎与客户端上可用的技术/ API无关,以方便上传.

javascript django file-upload http websocket

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

如何在python单元测试中模拟连接错误并请求超时

假设我的django/flask应用程序从API中提取信息,我如何测试连接异常是否被捕获并正确处理?

例如,这里有一个调用API的函数:

import requests
def call_the_api():
    url = 'http://httpbin.org/get'
    try:
        req = requests.get(url)
        if req.json().get('errors'):
            logger.warn("API error response")
            return {'request_error': 'api_error_response'}
    except requests.exceptions.ConnectionError:
        logger.warn('ConnectionError')
        return {'request_error': 'ConnectionTimeout'}
    except requests.exception.Timeout:
        logger.warn('API request timed out')
        return {'request_error': 'Timeout'}
    except Exception, ex:
        logger.warn("API request Exception: %s", ex)
        return {'request_error': ex}
    else:
        return req.json()
Run Code Online (Sandbox Code Playgroud)

为了测试来自API的响应,我发现mock非常有用.

def mock_get_request():
    response = requests.get.return_value
    json_file = 'sample_response.json'
    json_file_path = os.path.join(os.path.dirname(__file__), json_file)
    with open(json_file_path, 'r') as f:
        response.content = response.text = f.read()
    response.status_code = 200
    response.encoding = 'utf-8'
    response.json …
Run Code Online (Sandbox Code Playgroud)

python django unit-testing mocking python-requests

13
推荐指数
1
解决办法
7709
查看次数

如何组合两个函数,其外部函数为内部函数提供参数

我有两个类似的代码需要解析,我不确定实现这个的最pythonic方式.

假设我有两个相似的"代码"

secret_code_1 = 'asdf|qwer-sdfg-wert$$otherthing'
secret_code_2 = 'qwersdfg-qw|er$$otherthing'
Run Code Online (Sandbox Code Playgroud)

两个代码以...结尾$$otherthing并包含多个值-

起初我想过functools.wrap将一些常用逻辑与特定于每种类型代码的逻辑分开,如下所示:

from functools import wraps

def parse_secret(f):
  @wraps(f)
  def wrapper(code, *args):
    _code = code.split('$$')[0]
    return f(code, *_code.split('-'))
  return wrapper

@parse_secret
def parse_code_1b(code, a, b, c):
  a = a.split('|')[0]
  return (a,b,c)

@parse_secret
def parse_code_2b(code, a, b):
  b = b.split('|')[1]
  return (a,b)
Run Code Online (Sandbox Code Playgroud)

但是这样做会让你有点混淆你应该实际传递给parse_code_*函数的参数,即

parse_code_1b(secret_code_1)
parse_code_2b(secret_code_2)
Run Code Online (Sandbox Code Playgroud)

因此,为了更容易理解函数的形式参数,我将逻辑更改为:

def _parse_secret(parse_func, code):
  _code = code.split('$$')[0]
  return parse_func(code, *_code.split('-'))

def _parse_code_1(code, a, b, c):
  """
  a, b, and c are …
Run Code Online (Sandbox Code Playgroud)

python functional-programming

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

使用Factory Boy和GeoDjango PointFields

我正在为我刚开始的新GeoDjango项目编写测试.通常我使用Factory BoyFaker来创建用于测试的模型实例.但是我不清楚如何模拟GeoDjango PointField字段.当查看Spacialite中的记录时,它显示为二进制blob.

我对GIS的东西很陌生,对于如何在Django中为PointFields创建工厂有点困惑.

# models.py

from django.contrib.gis.db import models

class Place(models.Model):
    name = models.CharField(max_length=255)
    location = models.PointField(blank=True, null=True)

    objects = models.GeoManager()

    def __str__(self):
        return "%s" % self.name
Run Code Online (Sandbox Code Playgroud)
# factories.py

import factory
from faker import Factory as FakerFactory
from . import models

faker = FakerFactory.create()

class PlaceFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = models.Place

    name = factory.LazyAttribute(lambda x: faker.name())
    #location = What do I do?
Run Code Online (Sandbox Code Playgroud)

python gis django geodjango factory-boy

5
推荐指数
2
解决办法
917
查看次数

删除远程叉

我想删除bitbucket跟踪分支.我不确定我使用的术语是否正确,这可能会导致我无法使用Google获得解决方案的原因.

这就是我所拥有的:

tom@thinkpad:~/example$ git remote -v
bitbucket   git@bitbucket.org:TomLeo/example.git (fetch)
bitbucket   git@bitbucket.org:TomLeo/example.git (push)
origin  git@github.com:TomLeo/example.git (fetch)
origin  git@github.com:TomLeo/example.git (push)
Run Code Online (Sandbox Code Playgroud)

这就是我要的:

tom@thinkpad:~/example$ git remote -v
origin  git@github.com:TomLeo/example.git (fetch)
origin  git@github.com:TomLeo/example.git (push)
Run Code Online (Sandbox Code Playgroud)

git github

3
推荐指数
1
解决办法
2016
查看次数