错误用法

err := db.Transaction(func(tx *gorm.DB) error {
        tx = tx.Where("tid=?", req.Tid).Delete(Model{})
        if err := tx.Error; err != nil {
            common.LOGGER.Errorf("delete t fail,error:%s", err)
            return fmt.Errorf("删除任务出错")
        }

        if tx.RowsAffected == 0 {
            return fmt.Errorf("操作失败,请检查任务状态")
        }

        err := tx.Where("tid=?", req.Tid).Delete(Result{}).Error
        if err != nil {
            common.LOGGER.Errorf("delete result fail,error:%s", err)
            return fmt.Errorf("删除任务出错")
        }

        return nil
    })

正确用法

err := db.Transaction(func(tx *gorm.DB) error {
        result = tx.Where("tid=?", req.Tid).Delete(Model{})
        if err := result.Error; err != nil {
            common.LOGGER.Errorf("delete t fail,error:%s", err)
            return fmt.Errorf("删除任务出错")
        }

        if result.RowsAffected == 0 {
            return fmt.Errorf("操作失败,请检查任务状态")
        }

        result = tx.Where("tid=?", req.Tid).Delete(Result{})
        if err := result.Error; err != nil {
            common.LOGGER.Errorf("delete result fail,error:%s", err)
            return fmt.Errorf("删除任务出错")
        }

        return nil
    })

情况1

  1. linux 使用宿主机的网络地址 使用172.17.0.1(Docker默认桥接网络的网关地址)
  2. Windows或Mac,使用实际的IP地址或特定的地址(如host.docker.internal)

情况2

如果docker版本比较低,可以使用

docker run --add-host=host.docker.internal:host-gateway

对于 docker-compose.yml

services:
  your-service:
    extra_hosts:
      - "host.docker.internal:host-gateway"

如果无法识别 host-gateway,改为宿主机host

--add-host=host.docker.internal:<宿主机IP> ...

如果访问宿主机无法识别 host.docker.internal
报错
got error dial tcp: lookup host.docker.internal on 127.0.0.11:53: no such host
宿主机手动添加host

127.0.0.1 host.docker.internal

终极大招

修改宿主机防火墙规则,增加ip来源

sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3399" protocol="tcp" accept'

sudo firewall-cmd --reload

来源 https://www.zackwu.com/posts/2021-03-14-why-i-always-get-503-with-golang/
修复

package main

import (
    "crypto/tls"
    "fmt"
    "net/http"
)

func main() {
    defaultCipherSuites := []uint16{0xc02f, 0xc030, 0xc02b, 0xc02c, 0xcca8, 0xcca9, 0xc013, 0xc009, 
            0xc014, 0xc00a, 0x009c, 0x009d, 0x002f, 0x0035, 0xc012, 0x000a}
    client := http.Client{
        Transport: &http.Transport{
            TLSClientConfig: &tls.Config{
                CipherSuites: append(defaultCipherSuites[8:], defaultCipherSuites[:8]...),
            },
        },
    }
    req, err := http.NewRequest("GET", "https://www.bundesregierung.de/breg-en", nil)
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer resp.Body.Close()
    fmt.Println(resp.Status)
}

// Output:
// 200 OK

backend下目录结构

tree backend              
backend
├── __init__.py
├── admin.py
├── apps.py
├── models.py
├── signals.py
├── urls.py
└── views.py

__init__.py

default_app_config = 'backend.apps.BackendConfig'

apps.py

from django.apps import AppConfig


class BackendConfig(AppConfig):
    default_auto_field = "django.db.models.BigAutoField"
    name = "backend"

    def ready(self):
        import backend.signals

signals.py

import os

from django.db.models.signals import pre_save, post_save
from backend.models import *
from django.core.cache import cache


@receiver(pre_save, sender=Article)
def article_pre_save(sender, instance, **kwargs):
    if instance.pk:
        cache.delete(f'article_{instance.id}')