我想覆盖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 makemigrationsrunserver时,守护程序将运行,但其余命令不会运行。
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)上监听,为什么我会遇到这个问题?

最佳答案

https://pydigger.com/pypi/django-ipfs-storage

安装

..代码:: bash

pip install django-ipfs-storage

配置

默认情况下,ipfs_storage将内容添加并固定到IPFS守护程序
在本地主机上运行并返回指向公众的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 storagebackend <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
    

    关于python - 如何使用Django将表单/字段内容上传到IPFS节点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39840896/

    10-12 23:08