我想将(单个)文件上传到服务器并显示上传的进度.
我知道我可以使用HTTP POST上传文件.我不熟悉网络套接字,但据我所知,二进制数据也可以通过这种方式发送,因为websockets是双向的,我可以获得上传的进度.
我不担心旧浏览器,所以iframe和flash解决方案不是很吸引人,除非在这条路线上有显着的优势.
我也很好奇最好的服务器端技术.使用像Django这样的wsgi服务器有什么好处?或者像Node.js这样的非阻塞I/O技术?我不是在问web框架x是否优于web框架y,或者服务器x是否优于服务器y.但只是理想的技术应该具有什么才能在客户端设置上传.
更新:服务器端似乎与客户端上可用的技术/ API无关,以方便上传.
假设我的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) 我有两个类似的代码需要解析,我不确定实现这个的最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) 我正在为我刚开始的新GeoDjango项目编写测试.通常我使用Factory Boy和Faker来创建用于测试的模型实例.但是我不清楚如何模拟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) 我想删除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) django ×3
python ×3
factory-boy ×1
file-upload ×1
geodjango ×1
gis ×1
git ×1
github ×1
http ×1
javascript ×1
mocking ×1
unit-testing ×1
websocket ×1