如何使用 Django 将表单/字段内容上传到 IPFS 节点?
Posted
技术标签:
【中文标题】如何使用 Django 将表单/字段内容上传到 IPFS 节点?【英文标题】:How can I upload form/field contents to an IPFS node using Django? 【发布时间】:2017-02-11 22:42:57 【问题描述】:我想覆盖 django ImageField 的上传行为,以便在上传到某个 url 后,文件将被添加到 ipfs 节点。
例如,我的模型是这样的:
class Profile(models.Model):
picture = models.ImageField(upload_to=upload_location, blank=True)
我首先尝试像保存任何其他图像一样保存它,然后我给它一个 IPFS 哈希,这将允许用户加载数据客户端。
在我看来,我有以下代码来运行 ipfs 守护程序的实例。
import ipfsapi
from subprocess import call
os.system("ipfs daemon")
api = ipfsapi.connect('127.0.0.1', 5001)
但是,当我尝试运行 python manage.py makemigrations
或 runserver
时,守护程序会运行,但命令的其余部分不会。
Initializing daemon...
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/174.56.29.92/tcp/4001
Swarm listening on /ip4/192.168.1.109/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready
如何启动 ipfs 守护进程和 django 服务器?看起来他们正在侦听同一个端口(Django 8000、IPFS 8080),那我为什么会遇到这个问题?
【问题讨论】:
【参考方案1】:https://pydigger.com/pypi/django-ipfs-storage
安装
.. 代码:: bash
pip install django-ipfs-storage
配置
默认情况下,ipfs_storage
添加内容并将其固定到 IPFS 守护进程
在 localhost 上运行并返回指向公共的 URL
https://ipfs.io/ipfs/HTTP 网关
要对此进行自定义,请在您的 settings.py
中设置以下变量:
IPFS_STORAGE_API_URL
:默认为
'http://localhost:5001/api/v0/'
。
IPFS_GATEWAY_API_URL
:默认为'https://ipfs.io/ipfs/'
。
将IPFS_GATEWAY_API_URL
设置为'http://localhost:8080/ipfs/'
通过本地守护程序的 HTTP 网关提供内容。
用法
有两种方法可以使用 Django 存储后端。
作为默认后端 ~~~~~~~~~~~~~~~~~~
使用 IPFS 作为Django’s default file storage
backend <https://docs.djangoproject.com/en/1.11/ref/settings/#std:setting-DEFAULT_FILE_STORAGE>
__:
.. 代码:: python
# settings.py
DEFAULT_FILE_STORAGE = 'ipfs_storage.InterPlanetaryFileSystemStorage'
IPFS_STORAGE_API_URL = 'http://localhost:5001/api/v0/'
IPFS_STORAGE_GATEWAY_URL = 'http://localhost:8080/ipfs/'
对于特定的 FileField ~~~~~~~~~~~~~~~~~~~~~~~~
或者,您可能只想将 IPFS 存储后端用于 单个字段:
.. 代码:: python
from django.db import models
from ipfs_storage import InterPlanetaryFileSystemStorage
class MyModel(models.Model):
# …
file_stored_on_ipfs = models.FileField(storage=InterPlanetaryFileSystemStorage())
other_file = models.FileField() # will still use DEFAULT_FILE_STORAGE
【讨论】:
以上是关于如何使用 Django 将表单/字段内容上传到 IPFS 节点?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jquery 和 Ajax 将多个文件字段保存到 django