2026年3月21日 星期六

[水井USR] 使用Cookie來記錄旅人是否到過水井村網站

 




1.模版程式:templates/index.html

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="zh-Hant">
<head>
    <meta charset="UTF-8">
    <title>水井村導覽</title>
    <style>
        body { font-family: system-ui, sans-serif; text-align: center; padding: 60px 20px; }
        .welcome { font-size: 1.8rem; margin: 2rem 0; color: #2c7a77; }
        .count   { color: #555; }
        .btn     { padding: 12px 28px; background: #2c7a77; color: white; border: none; border-radius: 8px; font-size: 1.1rem; cursor: pointer; }
        .btn:hover { background: #1e5955; }
    </style>
</head>
<body>

    <h1>水井村</h1>
    <p class="welcome">{{ message }}</p>

    {% if has_visited %}
        <p class="count">這是你第 <strong>{{ visit_count }}</strong> 次來訪</p>
        <form action="{% url 'village:forget_me' %}" method="post">
            {% csrf_token %}
            <button type="submit" class="btn">忘記我讓我重新當新客</button>
        </form>
    {% else %}
        <p>這裡有風頭水尾打拼的故事有水井三寶的傳說等你來走一趟</p>
    {% endif %}

</body>
</html>

2.視域程式:village/views.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# village/views.py
from django.shortcuts import render, redirect


def home(request):
    # 檢查是否有 visit 水井村的 cookie
    has_visited = request.COOKIES.get('visited_suijing', False)

    if has_visited:
        message = "歡迎回到水井村!老朋友又見面啦~"
        visit_count = int(has_visited) + 1
    else:
        message = "歡迎來到水井村!第一次造訪的旅人~"
        visit_count = 1

    context = {
        'message': message,
        'visit_count': visit_count,
        'has_visited': bool(has_visited),
    }

    response = render(request, 'index.html', context)

    # 設定/更新 cookie(存活 30 天)
    response.set_cookie(
        key='visited_suijing',
        value=str(visit_count),           # 順便記錄來訪次數
        max_age=60 * 60 * 24 * 30,        # 30 天
        httponly=True,                    # 推薦:防止 JavaScript 存取
        samesite='Lax',                   # 推薦的安全設定
        # secure=True,                    # 上線時建議開啟(需 HTTPS)
    )

    return response


def forget_me(request):
    """刪除 cookie,讓下次變成第一次造訪"""
    response = redirect('village:home')
    response.delete_cookie('visited_suijing')
    return response

3.APP路由程式:village/urls.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# village/urls.py

from django.urls import path
from . import views

app_name = 'village'

urlpatterns = [
    path('', views.home, name='home'),
    path('forget-me/', views.forget_me, name='forget_me'),
]

4.主路由程式:suijing_village/urls.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
"""suijing_village URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('village.urls')),
]

5.設定程式:suijing_village/settings.py
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
"""
Django settings for suijing_village project.

Generated by 'django-admin startproject' using Django 4.0.6.

For more information on this file, see
https://docs.djangoproject.com/en/4.0/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.0/ref/settings/
"""

from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-5d5y6c=nx8d1x+tn!r2!tl7fnlj)6_+l2_o90czc#d907!q6df'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['cmlin.pythonanywhere.com']


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'village',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'suijing_village.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'suijing_village.wsgi.application'


# Database
# https://docs.djangoproject.com/en/4.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}


# Password validation
# https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/4.0/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.0/howto/static-files/

STATIC_URL = 'static/'

# Default primary key field type
# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

# default static files settings for PythonAnywhere.
# see https://help.pythonanywhere.com/pages/DjangoStaticFiles for more info
MEDIA_ROOT = '/home/cmlin/suijing_village/media'
MEDIA_URL = '/media/'
STATIC_ROOT = '/home/cmlin/suijing_village/static'
STATIC_URL = '/static/'

2026年3月19日 星期四

用Python將有機食物樣版轉換成Django網站


 前一篇文章:下載有機食物樣版實作Django網站

轉換的Python程式是用Gemini產生。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import re
import os

def convert_html_to_django(input_file, output_file):
    if not os.path.exists(input_file):
        print(f"錯誤:找不到檔案 {input_file}")
        return

    with open(input_file, 'r', encoding='utf-8') as f:
        content = f.read()

    # 1. 在檔案最上方加入 {% load static %} (如果還沒有的話)
    if "{% load static %}" not in content:
        content = "{% load static %}\n" + content

    # 2. 處理 href 和 src 屬性
    # 這裡將替換字串拆解,避免使用反斜線轉義引號
    pattern_attr = r'(href|src)=["\']((?!http|https|#|{%)[^"\']+\.(?:css|js|png|jpg|jpeg|gif|svg|webp|ico))["\']'
    
    # 使用正確的拼接方式: \1="{% static ' \2 ' %}"
    replacement_attr = r'\1="{% static ' + "'" + r'\2' + "'" + r' %}"'
    content = re.sub(pattern_attr, replacement_attr, content)

    # 3. 處理 CSS inline style 中的 url('...')
    # 修正 url() 內部的路徑轉換
    pattern_url = r'url\(["\']?((?!http|https|{%)[^"\'\)]+)["\']?\)'
    
    # 這裡改為標準字串處理,確保輸出為 url('{% static 'path' %}')
    replacement_url = "url('{% static '\\1' %}')"
    content = re.sub(pattern_url, replacement_url, content)

    # 4. 輸出轉換後的檔案
    with open(output_file, 'w', encoding='utf-8') as f:
        f.write(content)

    print(f"轉換成功!已修正轉義符號。檔案已儲存至: {output_file}")

# 執行轉換
if __name__ == "__main__":
    convert_html_to_django('index.html', 'index_django.html')


2026年3月16日 星期一

[水井USR] 用Gemini實作文蛤智慧養殖雲端AI專家系統

本篇文章採用Gemini AI協作,並以gemini-2.5-flash為模型。





範例一、定義水質參數

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import os
from google import genai

# 1. 初始化設定
api_key = os.environ.get("GOOGLE_API_KEY")
if not api_key:
    raise ValueError("請先設定 GOOGLE_API_KEY 環境變數")

client = genai.Client(api_key=api_key)

# 2. 定義水質參數 (可從感測器動態傳入)
temp = 31
do_level = 3.5
location = "A1 文蛤池"

# 3. 建立具有養殖專業語氣的 Prompt
prompt = f"""
你是一位專業的水產養殖專家。根據以下監測數據提供改善建議:
- 池塘編號:{location}
- 當前水溫:{temp}°C
- 溶氧量 (DO):{do_level} mg/L

請用繁體中文回答,包含:
1. 現況分析(水溫與溶氧是否正常)。
2. 具體操作建議(如:水車啟動數量、換水、停餌建議)。
3. 語氣要親切且專業。
"""

# 4. 呼叫 Gemini 2.5 Flash 模型
response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents=prompt
)

# 5. 輸出結果
print("-" * 30)
print(f"【{location} 監測報告】")
print(response.text)
print("-" * 30)

執行結果:
【A1 文蛤池 監測報告】
您好,根據您提供的A1文蛤池監測數據,水溫31°C和溶氧量(DO) 3.5 mg/L,這確實是一個需要立即關注的緊急情況。讓我為您分析並提供具體操作建議。

---

### **1. 現況分析 (水溫與溶氧是否正常)**

*   **水溫 (31°C):** 對於文蛤而言,31°C的水溫已經**偏高,且接近文蛤能承受的上限**。文蛤最適合生長的水溫約在20-28°C之間。高溫會加速文蛤的新陳代謝,增加其耗氧量,同時也會降低水中溶氧的飽和度(水中能溶解的氧氣量變少)。長期處於高溫環境,會嚴重影響文蛤的攝食、生長,並使其免疫力下降,容易受病害侵襲,甚至導致熱緊迫死亡。

*   **溶氧量 (DO) (3.5 mg/L):** 3.5 mg/L的溶氧量對於水產養殖來說,已經是**嚴重偏低,屬於警戒範圍**。一般而言,養殖水體的溶氧量應維持在5 mg/L以上為佳。當溶氧量低於4 mg/L時,養殖生物就會開始感到緊迫;低於3 mg/L則可能導致厭食、生長停滯甚至死亡。目前文蛤正處於缺氧的危險邊緣,加上高水溫的雙重壓力,情況確實不容樂觀。

**綜合來看,A1文蛤池目前正處於一個高水溫且低溶氧的緊迫環境,文蛤的健康狀況和存活率面臨極大挑戰,必須迅速採取行動。**

---

### **2. 具體操作建議**

面對這樣的緊急情況,我們需要立即採取多項措施來改善水質環境,降低文蛤的緊迫。

*   **水車啟動數量:**
    *   **建議:** **請立即啟動池中所有可用的水車(或增氧設備),並確保24小時不間斷運轉。**
    *   **原因:** 這是提升水體溶氧最直接且有效的方式。所有水車全開可以最大程度地增加水體與空氣的接觸面積,加速氧氣溶入水中,同時也能擾動水體,將底層的厭氧區向上翻動,避免產生硫化氫等有害物質。

*   **換水:**
    *   **建議:** **立即進行大量換水,建議更換池水量的1/3至1/2。** 換水時務必注意,引入的新水需確認水質良好,且水溫盡量不要與池水溫差過大(理想情況是新水溫度稍低或與原水接近)。
    *   **原因:** 大量換水有多重好處:
        *   引入更低溫、溶氧量更高的新鮮水,可以有效降低池水溫度和提升溶氧。
        *   稀釋水中有害代謝物(如氨氮、亞硝酸鹽)的濃度。
        *   帶走過多的有機質,減少細菌分解有機物時的耗氧量。

*   **停餌建議:**
    *   **建議:** **請立即停止投餵任何餌料,直到池水狀況(水溫降至28°C以下,溶氧量恢復至5 mg/L以上)明顯改善且穩定後,再考慮少量恢復投餵。**
    *   **原因:**
        *   在高溫低氧環境下,文蛤的攝食能力和消化功能會大幅下降,此時投餵的餌料不僅無法被有效利用,反而會沉積在池底,增加池底有機質的負荷。
        *   這些未被食用的餌料會迅速分解,進一步消耗水體中的氧氣,使溶氧情況雪上加霜。
        *   文蛤處於緊迫狀態時,需要將能量用於應對環境壓力而非消化食物。

---

### **3. 其他注意事項**

*   **持續監測:** 採取上述措施後,請務必密切且頻繁地監測池水的水溫和溶氧量,特別是清晨時段,因為此時溶氧量通常最低。
*   **水質管理:** 檢查進水口的水質,確保引進的水源沒有污染。若有條件,可以考慮使用水質改良劑(如沸石粉、EM菌等)來分解有機物,改善水質。
*   **遮蔭措施:** 如果池塘可以進行部分遮蔭,將有助於降低水溫,尤其是在日間太陽直射時。

---

希望這些緊急建議能幫助您迅速改善文蛤池的狀況,降低損失。請務必迅速採取行動,並隨時監測,祝您一切順利!如有任何疑問或需要進一步協助,請隨時提出。

範例二、結合水池的照片來進行判斷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import os
from google import genai
from PIL import Image

# 1. 初始化設定
api_key = os.environ.get("GOOGLE_API_KEY")
if not api_key:
    raise ValueError("請先設定 GOOGLE_API_KEY 環境變數")

client = genai.Client(api_key=api_key)

def analyze_clam_pond(image_path, temp, ph, do, salinity):
    """
    整合文蛤養殖標準與 AI 影像辨識的診斷系統
    """
    # A. 基礎數值邏輯判定 (文蛤專用標準)
    alerts = []
    if temp > 30: alerts.append(f"⚠️ 水溫過高 ({temp}°C):注意底泥發酵與溶氧快速消耗。")
    if ph < 7.8: alerts.append(f"⚠️ pH 值偏低 ({ph}):水質趨酸,可能影響文蛤外殼發育。")
    if do < 4.0: alerts.append(f"⚠️ 溶氧不足 ({do} mg/L):低於文蛤安全門檻,請務必開啟水車。")
    if not (15 <= salinity <= 25): alerts.append(f"⚠️ 鹽度異常 ({salinity} psu):注意文蛤開口或滲透壓壓力。")
    
    status_summary = "\n".join(alerts) if alerts else "✅ 基礎水質數據皆在標準範圍內。"

    # B. 準備 AI 診斷 Prompt
    # 這裡我們把數值判定結果也餵給 AI,讓它參考
    prompt = f"""
    你是一位專業的文蛤養殖專家。請分析附件中的池塘照片,並結合以下監測數據給出專業建議:

    【當前監測數據】
    - 水溫:{temp}°C
    - pH值:{ph}
    - 溶氧量:{do} mg/L
    - 鹽度:{salinity} psu

    【初步數值警示】
    {status_summary}

    【AI 任務】
    1. 觀察照片中的「水色」:判斷藻類種類(如矽藻、綠藻或藍藻)與濃度。
    2. 觀察「水面情況」:是否有過多泡沫、油膜或倒藻跡象。
    3. 綜合診斷:結合高溫 ({temp}°C) 與溶氧 ({do} mg/L) 的現況,給出具體的「水車操作」與「水質改良」建議。
    4. 請用繁體中文回答,語氣要精簡且對農民有實質幫助。
    """

    # C. 執行多模態分析
    try:
        img = Image.open(image_path)
        response = client.models.generate_content(
            model="gemini-2.5-flash",
            contents=[prompt, img]
        )
        
        return response.text
    except Exception as e:
        return f"分析失敗:{e}"

# --- 實際執行範例 ---
# 假設你的照片檔案名為 'pond.jpg'
# 測試數據:水溫31, pH 7.6, 溶氧 3.5, 鹽度 20
result = analyze_clam_pond("BOYDpic1.webp", temp=31, ph=7.6, do=3.5, salinity=20)

print("="*50)
print("🐚 文蛤養殖智慧診斷報告")
print("="*50)
print(result)
print("="*50)

執行結果:
==================================================
🐚 文蛤養殖智慧診斷報告
==================================================
農民您好,

根據池塘照片與監測數據,目前情況相當緊急,必須立即採取行動。

### 1. 水色判斷與藻類分析:

*   水色: 照片顯示水色呈現濃郁的「翠綠色」,且透明度低。
*   藻類種類與濃度: 高度判斷為 綠藻(Green Algae) 大量繁殖,甚至可能伴隨 藍綠藻(Blue-green Algae) 的發生。藻類濃度極高,已形成藻華(Algal Bloom)。

### 2. 水面情況觀察:

*   水面:整體水面呈現濃綠色,部分區域可見深淺不一的團塊或條狀分佈,這可能是藻類大量繁殖後局部集結,或是已有少量藻類開始老化、沉降的初期跡象。
*   泡沫/油膜: 照片中未見明顯大量泡沫或油膜,但濃密的藻類層本身就容易阻礙氣體交換。
*   倒藻跡象: 雖未見大規模「倒藻」後的灰白色水體或濃烈腥臭味,但水色的不均勻性及高溫低溶氧的環境,預示著倒藻風險極高。一旦倒藻,溶氧將會急速耗盡,造成災難性後果。

### 3. 綜合診斷與專業建議:

目前的文蛤池面臨 嚴重溶氧不足高溫壓力藻相失衡 及 水質酸化 的多重危機。文蛤在溶氧3.5 mg/L的環境下已處於極度緊迫狀態,若不立即改善,將有大量死亡風險。

【水車操作建議】

*   全天候運轉: 務必 全天候不間斷開啟所有水車。特別是夜間至清晨,藻類停止光合作用,反而會大量消耗氧氣,此時水車更是維繫文蛤生命的關鍵。
*   增加水車數量/功率: 若現有水車數量或功率不足,應立即考慮增加,確保水體有足夠的攪動與溶氧供給。
*   調整水車位置: 確保水車能有效帶動底層水體,避免底部缺氧。

【水質改良建議】

1. 緊急增氧與降溫:
    *   強力增氧: 除了水車,若有條件,可輔以吹氣式增氧機,將空氣打入水底,提升溶氧。
    *   適度換水: 在確保進水水質良好的前提下,逐步、少量地進行換水,每次換水量約1/4至1/3,以稀釋過濃藻類及降低水溫,並帶走部分有害物質。換水時注意水流速度,避免驚擾文蛤。
2.  藻相控制與穩定水色:
    *   施用益生菌: 立即施用高效能的 水產專用益生菌(如光合細菌、EM菌)。益生菌能分解水體中的有機物,減少藻類所需的養分,抑制有害藻類的過度生長,並穩定水色。每3-5天施用一次,持續觀察。
    *   切勿直接施用殺藻劑: 在目前低溶氧且藻類過多的情況下,使用殺藻劑會導致藻類大量死亡,進一步消耗水體溶氧,加速文蛤死亡。
3.  pH 值調控與底泥改善:
    *   提升pH值: 立即施用 碳酸鈣(CaCO3)或沸石粉,提升水體鹼度,穩定pH值,有利於文蛤外殼發育。請分次、少量施用,避免pH值劇烈波動。
    *   底泥改良: 高溫導致底泥發酵加速,釋放有害氣體。除了益生菌,可配合施用 **底質改良劑(如沸石粉、腐植酸鈉)**,以分解底部有機質,改善底泥環境,減少有毒物質釋放。
4.  密切監測:
    *   高頻率監測: 每日至少早晚各監測一次水溫、pH值、溶氧量,記錄數據並觀察文蛤活動狀況。
    *   定期巡查: 觀察水面是否有異常泡沫、油膜或藻類漂浮物,以及文蛤是否有上爬、開口等異常行為。

**總結:**

目前情況危急,請農民務必 立即開啟水車,並著手進行水質改良措施。以「增氧」為首要任務,同時兼顧「藻相管理」與「pH及底泥改善」。密切監測,任何異常都應迅速處理。

2026年3月15日 星期日

[水井USR] 用Gemini實作水井USR智慧養殖雲端AI專家系統

 範例一:簡易提問

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import os
from google import genai

api_key = os.environ.get("GOOGLE_API_KEY")

if not api_key:
    raise ValueError("請先設定 GEMINI_API_KEY 環境變數")

client = genai.Client(api_key=api_key)


# Prompt text
prompt = '''水溫31°C 溶氧3.5 mg/L 養殖建議需要打開水車, 請用繁中文回答'''

# Generate text
response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents=prompt
)

# Print the output
print(response.text)

執行結果:
針對水溫31°C且溶氧僅有3.5 mg/L的情況,強烈建議您**立即打開水車 (或所有可用的增氧設備)**。

**原因如下:**

1.  **溶氧量過低:**
    *   正常健康的養殖水體,溶氧量應維持在**5 mg/L以上**,理想狀態是6 mg/L以上。
    *   3.5 mg/L 對大多數養殖生物來說已是「缺氧」或「嚴重低氧」狀態。
    *   在這個水平下,養殖生物會感到嚴重緊迫,影響其生理機能。

2.  **高水溫加劇問題:**
    *   水溫31°C屬於高溫,會導致:
        *   **水體溶氧能力下降:** 溫水本身能溶解的氧氣量就比冷水少。
        *   **養殖生物耗氧量增加:** 高溫會加速魚蝦等水生動物的新陳代謝,使其對氧氣的需求量大幅增加。
    *   因此,3.5 mg/L在高水溫下,其危害程度遠比在低水溫下更為嚴重。

**可能導致的後果:**

*   養殖生物產生嚴重緊迫、活動力下降。
*   食慾不振,生長遲緩。
*   免疫力下降,容易感染疾病。
*   出現「浮頭」現象 (魚蝦浮到水面呼吸)。
*   嚴重時將導致**大量死亡**,造成重大經濟損失。

**建議處理措施:**

1.  **立即啟動所有可用的水車或增氧設備**,以迅速增加水體溶氧量,並促進水體循環。
2.  **密切觀察**養殖生物的反應,並**持續監測**溶氧數據,直到溶氧量回升至安全水平 (例如5 mg/L以上)。
3.  如果現有的水車不足以應付,可能需要考慮**增加增氧設備的數量或提升其效率**。
4.  同時,檢查是否有**過度投餵、水質惡化(有機物過多)或藻類大量繁殖(夜間耗氧)**等加劇缺氧問題的因素,並加以處理。

總之,水溫31°C、溶氧3.5 mg/L是非常危險的組合,必須**立即採取增氧措施**。

範例二、以專家方式提問

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import os
from google import genai

api_key = os.environ.get("GOOGLE_API_KEY")

if not api_key:
    raise ValueError("請先設定 GEMINI_API_KEY 環境變數")

client = genai.Client(api_key=api_key)


# Prompt text
prompt = '''你是一位台灣水產養殖專家,專長文蛤養殖管理。

文蛤養殖水質建議範圍:
水溫:20–30°C
溶氧:≥4 mg/L
pH:7.5–8.5
鹽度:15–30 ppt

目前養殖池感測資料:
水溫:31°C
溶氧:3.5 mg/L
pH:7.8
鹽度:28 ppt

請分析目前養殖狀況並提供:
1. 水質是否異常
2. 可能風險
3. 建議管理措施

請用繁體中文回答'''

# Generate text
response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents=prompt
)

# Print the output
print(response.text)

執行結果:
您好,我是台灣的水產養殖專家,專長文蛤養殖管理。根據您提供的文蛤養殖水質建議範圍與目前的感測數據,以下是我的分析與建議:

---

### **1. 水質是否異常**

根據您提供的資料,目前養殖池的水質有以下異常狀況:

*   **水溫:異常 (偏高)**
    *   建議範圍:20–30°C
    *   目前數據:31°C
    *   分析:目前水溫已超過建議上限,屬於偏高。
*   **溶氧:異常 (偏低)**
    *   建議範圍:≥4 mg/L
    *   目前數據:3.5 mg/L
    *   分析:目前溶氧量低於建議下限,屬於不足。
*   **pH:正常**
    *   建議範圍:7.5–8.5
    *   目前數據:7.8
    *   分析:pH值在建議範圍內,狀況良好。
*   **鹽度:正常**
    *   建議範圍:15–30 ppt
    *   目前數據:28 ppt
    *   分析:鹽度在建議範圍內,狀況良好。

**總結:** 目前養殖池主要問題是 **水溫過高** 且 **溶氧不足**。

---

### **2. 可能風險**

水溫過高與溶氧不足是文蛤養殖中非常危險的組合,可能導致以下嚴重風險:

*   **生理壓力與攝食受阻:**
    *   高水溫會加速文蛤的新陳代謝,使其消耗更多能量,處於生理緊迫狀態。
    *   低溶氧會導致文蛤呼吸困難,降低活動力與攝食效率,長期會影響其生長與肥滿度,甚至閉殼不活動。
*   **免疫力下降與疾病爆發:**
    *   文蛤長期處於高溫低氧的緊迫環境,其免疫系統會受到抑制,對病原體的抵抗力下降,增加感染疾病的風險。
*   **育成率降低與急性死亡:**
    *   嚴重的低溶氧會直接導致文蛤窒息死亡。高水溫同時會降低水體溶氧能力,使得文蛤更容易因缺氧而死亡,可能導致文蛤大量浮頭或死亡,育成率大幅下降。
*   **藻相不穩定與水質惡化:**
    *   高水溫也可能導致養殖池中藻類種類變化,一些有害藻類(如藍綠藻)在高溫下容易繁殖,進一步影響水質和文蛤健康。
    *   文蛤因緊迫而攝食率下降,水中有機物無法有效被利用,可能導致水質進一步惡化,形成惡性循環。

---

### **3. 建議管理措施**

面對目前水溫偏高與溶氧不足的狀況,應立即採取以下管理措施:

1.  **立即改善溶氧狀況:**
    *   **啟動水車或增氧設備:** 應立即全天候開啟水車、葉輪式增氧機或鼓風機,以最大功率運轉,迅速增加水體溶氧量,直到溶氧恢復到至少 4 mg/L 以上。
    *   **適度換水:** 若有充足且水溫較低、溶氧較高的水源,可考慮逐步換入新鮮海水。建議在夜間或清晨時段進行換水,每次換水量不宜過大 (例如 1/3~1/4 池水),並注意新舊水溫差不宜超過 2°C,避免造成文蛤更大的緊迫。
    *   **減少有機負荷:** 檢查池中是否有過多的殘餌、死亡藻類或死亡生物,應及時清除,以減少水中有機物的分解耗氧。

2.  **執行降溫措施:**
    *   **增加水深:** 若可行,適度提高養殖池水深(例如增加 10-20 公分),較深的水體有助於穩定水溫,減緩升溫速度。
    *   **遮陽措施:** 若為較小的養殖池,可考慮在池面上架設遮陽網或帆布,減少陽光直射,有助於降低水溫。
    *   **換水降溫:** 如前所述,若新水源水溫較低,換水也能起到一定的降溫效果。

3.  **密切監測與調整:**
    *   **加強水質監測頻率:** 在此異常期間,每日至少早、中、晚各測量一次水溫和溶氧,密切追蹤改善效果。
    *   **觀察文蛤活動狀況:** 隨時觀察文蛤的行為,例如是否有開殼攝食、是否有閉殼不活動、是否有浮頭(雖然文蛤不浮頭,但活動力會顯著下降)或異常死亡的情形。
    *   **評估養殖密度:** 若高溫低氧狀況持續且難以改善,應評估目前養殖密度是否過高。未來在放養前,需更精確評估環境承載力,適度降低放養密度,以提高抗逆境能力。

4.  **改善池底環境:**
    *   健康的底泥對於文蛤生長至關重要。可以考慮施用有益微生物製劑(如光合菌、硝化菌),幫助分解底泥有機物,穩定水質並減少底泥耗氧。

這些措施應同時進行,並持續觀察文蛤的反應和水質變化,以確保養殖狀況能夠迅速恢復穩定。高溫和低溶氧是導致文蛤養殖失敗的常見原因,務必嚴陣以待。

範例三、給予文蛤最佳養殖條件的提示詞

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import os
from google import genai

api_key = os.environ.get("GOOGLE_API_KEY")

if not api_key:
    raise ValueError("請先設定 GEMINI_API_KEY 環境變數")

client = genai.Client(api_key=api_key)


# Prompt text
prompt = '''你是一個智慧養殖 AI 助手,負責分析文蛤養殖池的水質資料。

文蛤最佳養殖條件:
水溫:20–30°C
溶氧:≥4 mg/L
pH:7.5–8.5
鹽度:15–30 ppt

目前感測資料:
水溫:31°C
溶氧:3.5 mg/L
pH:7.1
鹽度:12 ppt

請完成以下任務:
1. 判斷水質是否正常
2. 評估缺氧風險
3. 提供三項管理建議
4. 回覆需簡潔並適合養殖戶閱讀

請用繁體中文回答'''

# Generate text
response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents=prompt
)

# Print the output
print(response.text)

執行結果:
養殖戶您好,根據您提供的文蛤養殖池水質資料,分析結果如下:

1.  **水質狀況判斷:**
    目前水質狀況異常,所有指標皆偏離文蛤最佳養殖條件。
    *   **水溫:** 31°C (偏高,最佳為 20-30°C)
    *   **溶氧:** 3.5 mg/L (偏低,最佳為 ≥4 mg/L)
    *   **pH:** 7.1 (偏低,最佳為 7.5-8.5)
    *   **鹽度:** 12 ppt (偏低,最佳為 15-30 ppt)

2.  **缺氧風險評估:**
    溶氧量已低於最佳範圍(3.5 mg/L < 4 mg/L),文蛤存在明顯缺氧風險,請務必留意。

3.  **三項管理建議:**
    *   **立即增氧:** 啟動增氧設備,快速提升溶氧量至安全範圍,減緩文蛤緊迫。
    *   **調整鹽度與pH:** 評估引進較高鹽度且水質良好的水源進行換水;同時可考慮適量施用生石灰或碳酸鈣,逐步提升池水pH值。
    *   **高溫降溫:** 在高溫時段,可考慮增加水深或設置遮陽網,幫助降低水溫,減少文蛤熱緊迫。

範例四:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import os
from google import genai

api_key = os.environ.get("GOOGLE_API_KEY")

if not api_key:
    raise ValueError("請先設定 GEMINI_API_KEY 環境變數")

client = genai.Client(api_key=api_key)


# Prompt text
prompt = '''你是一個智慧養殖 AI 助手,負責分析文蛤養殖池的水質資料。

文蛤最佳養殖條件:
水溫:20–30°C
溶氧:≥4 mg/L
pH:7.5–8.5
鹽度:15–30 ppt

過去6小時水質變化:

時間    溫度   溶氧
10:00   29    5.0
12:00   30    4.2
14:00   31    3.5

請完成以下任務:
1. 判斷水質是否正常
2. 評估缺氧風險
3. 提供三項管理建議
4. 回覆需簡潔並適合養殖戶閱讀

請用繁體中文回答'''

# Generate text
response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents=prompt
)

# Print the output
print(response.text)

執行結果:
養殖戶您好,根據您提供的文蛤養殖池水質數據,分析與建議如下:

1.  **水質狀況判斷:**
    *   **水質已偏離正常。** 截至14:00,水溫已達31°C,超出文蛤最佳養殖溫度上限(30°C);同時,溶氧量為3.5 mg/L,已低於最佳標準(≥4 mg/L)。

2.  **缺氧風險評估:**
    *   **缺氧風險高。** 溶氧量在短短4小時內從5.0 mg/L迅速下降至3.5 mg/L,且目前已處於缺氧邊緣。持續高溫會進一步降低水中溶氧能力,若不立即處理,將嚴重影響文蛤健康。

3.  **管理建議:**
    *   **立即增氧:** 請立即啟動水車或增氧設備,全力增加池水溶氧量,目標盡快恢復到4 mg/L以上。
    *   **降溫處理:** 考慮採取遮陽措施或適量換入較涼的水體,以降低池水溫度,緩解高溫對文蛤的壓力並有助於提高溶氧。
    *   **密切監測:** 建議每1-2小時再次測量溶氧和溫度,並觀察文蛤活動狀況。若有pH和鹽度測試條件,也請一併監測,以掌握全面水質狀況。

請務必立即採取行動,確保文蛤健康。

[水井USR] 用本地端實作水井USR智慧養殖AI專家系統

 採用Ollama搭配llama3模型。


範例一、初體驗
程式碼:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import requests

url = "http://localhost:11434/api/generate"

data = {
    "model": "llama3",
    "prompt": "水溫31°C 溶氧3.5 mg/L 養殖建議需要打開水車, 請用繁中文回答",
    "stream": False
}

response = requests.post(url, json=data)

print(response.json()["response"])

執行結果:
🌊

根據你的提供的水質資料,水溫為 31°C,溶氧為 3.5 mg/L。這個情況下,我們可以結合養殖魚類的基本需求,進行建議。

通常來說,養殖魚類需要維持適宜的水質環境,以確保其健康和生存。以下是一些魚類需要的基本水質標準:

* 水溫:15°C ~ 30°C(不同物種的溫度需求可能會有所差異)
* 溶氧:5 mg/L ~ 10 mg/L(不同的養殖魚類對於溶氧的需求也不同)

在你的情況下,水溫高於 30°C,已經超出一般養殖魚類的適宜溫度範圍。這可能會導致魚類受到熱傷害或增加疾病的風險。

另外,溶氧僅有 3.5 mg/L,這也可能對養殖魚類造成負面影響。在水質檢測中,溶氧不足是魚類死亡的主要原因之一。

因此,在這個情況下,我們建議你打開水車,進行水循環和加強空氣饋送,以提高水溫和增加溶氧的水平。這可以幫助養殖魚類維持健康的環境,並減少疾病的風險。

請注意,這只是一個簡單的建議,你還是需要根據實際情況和養殖魚類的特點進行調整和監控,以確保魚類的健康和生存。

範例二、以專家方式提問

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import requests

url = "http://localhost:11434/api/generate"
prompt = '''
你是一位台灣水產養殖專家,專長文蛤養殖管理。

文蛤養殖水質建議範圍:
水溫:20–30°C
溶氧:≥4 mg/L
pH:7.5–8.5
鹽度:15–30 ppt

目前養殖池感測資料:
水溫:31°C
溶氧:3.5 mg/L
pH:7.8
鹽度:28 ppt

請分析目前養殖狀況並提供:
1. 水質是否異常
2. 可能風險
3. 建議管理措施

請用繁體中文回答
'''

data = {
    "model": "llama3",
    "prompt": prompt,
    "stream": False
}

response = requests.post(url, json=data)

print(response.json()["response"])

執行結果:
根據現有的養殖池感測資料,文蛤養殖水質如下:

* 水溫:31°C,超過recommended範圍(20–30°C),這可能對文蛤的生長和健康產生負面影響。
* 溶氧:3.5 mg/L,低於recommended範圍(≥4 mg/L),這可能導致文蛤缺乏足夠的氧氣,從而影響其生長和存活率。
* pH:7.8,接近recommended範圍(7.5–8.5),但仍需要監測,以免 pH 突然變化。
* 鹽度:28 ppt,超過recommended範圍(15–30 ppt),這可能對文蛤的生長和健康產生負面影響。

因此,我們可以結論:

1. 水質異常,因為水溫、溶氧和鹽度都超出了recommended範圍。
2. 可能風險包括文蛤的生長和健康受到影響,可能導致存活率下降或死亡。
3. 建議管理措施如下:
* 增加空氣氧氣的混入,以提高溶氧濃度(≥4 mg/L)。
* 監測水溫,並考慮對養殖池的冷卻措施,以將水溫控制在recommended範圍(20–30°C)內。
* 減少鹽度,透過調整養殖池的鹽分濃度或添加淡水,以降低鹽度(15–30 ppt)。
* 定期監測養殖池中的其他指標,如濁度、PH 等,並採取適當措施來維持良好的養殖環境。

總之,需要立即對養殖池進行調整和監測,以避免文蛤的生長和健康受到負面影響。

範例三、給予文蛤最佳養殖條件的提示詞

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import requests

url = "http://localhost:11434/api/generate"
prompt = '''
你是一個智慧養殖 AI 助手,負責分析文蛤養殖池的水質資料。

文蛤最佳養殖條件:
水溫:20–30°C
溶氧:≥4 mg/L
pH:7.5–8.5
鹽度:15–30 ppt

目前感測資料:
水溫:31°C
溶氧:3.5 mg/L
pH:7.1
鹽度:12 ppt

請完成以下任務:
1. 判斷水質是否正常
2. 評估缺氧風險
3. 提供三項管理建議
4. 回覆需簡潔並適合養殖戶閱讀

請用繁體中文回答
'''

data = {
    "model": "llama3",
    "prompt": prompt,
    "stream": False
}

response = requests.post(url, json=data)

print(response.json()["response"])

執行結果:
Based on the current sensor data, I'll provide my analysis and recommendations as follows:

**1. 水質是否正常?**

根據文蛤最佳養殖條件,水溫高於31°C超出標準值(20-30°C),鹽度也低於15 ppt(12 ppt)。這些數據表明水質並不正常。

**2. 缺氧風險評估**

溶氧水平為3.5 mg/L,低於文蛤最佳養殖條件(≥4 mg/L),因此存在缺氧風險。高溫和低鹽度可能增加缺氧風險。

**3. 三項管理建議**

1. **降溫**:立即調整水溫至20-30°C,以減少缺氧風險。
2. **增氧**:增加溶氧水平以提高養殖池中的氧氣含量。
3. **鹽度調整**:增加鹽度至15-30 ppt,以滿足文蛤的需求。

**總結**

文蛤養殖池的水質不正常,存在缺氧風險。需要立即采取措施降溫、增氧和調整鹽度以改善水質,並減少對養殖戶的影響。

範例四、加入歷史資料

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import requests

url = "http://localhost:11434/api/generate"
prompt = '''
你是一個智慧養殖 AI 助手,負責分析文蛤養殖池的水質資料。

文蛤最佳養殖條件:
水溫:20–30°C
溶氧:≥4 mg/L
pH:7.5–8.5
鹽度:15–30 ppt

過去6小時水質變化:

時間    溫度   溶氧
10:00   29    5.0
12:00   30    4.2
14:00   31    3.5

請完成以下任務:
1. 判斷水質是否正常
2. 評估缺氧風險
3. 提供三項管理建議
4. 回覆需簡潔並適合養殖戶閱讀

請用繁體中文回答
'''

data = {
    "model": "llama3",
    "prompt": prompt,
    "stream": False
}

response = requests.post(url, json=data)

print(response.json()["response"])

執行結果:
Based on the water quality data, I'll provide my analysis and recommendations as follows:

**1.判斷水質是否正常**
水溫在 20–30°C 之間,達到文蛤最佳養殖條件;溶氧較低,4.2 mg/L 和 3.5 mg/L 是相對較低的數據,但仍在可接受範圍內(≥4 mg/L)。pH 值也在 7.5–8.5 之間。總的來說,水質大致正常,但溶氧值較低可能需要注意。

**2.評估缺氧風險**
根據數據,溶氧值下降明顯,從 5.0 mg/L 減少到 3.5 mg/L。在這種情況下,文蛤可能會發生缺氧的問題,因此需要注意監控水質和進行適當的調整。

**3.提供三項管理建議**

1. **監控溶氧值**:需要隨時監控溶氧值,確保其不再下降。
2. **增加養殖池流量**:增加養殖池流量可以幫助增加溶氧值和改善水質。
3. **增加 dissolved oxygen  (DO) 增強措施**:考慮使用 DO 增強措施,如增加磨灘設備或增加 aeration 設備,來提高溶氧值。

總的來說,水質大致正常,但需要注意監控和進行適當的調整,以避免文蛤養殖池中的缺氧問題。

2026年2月19日 星期四

[Django 6.0] 把尚虎雲生產端佈署到Render平台

1.下載尚虎雲生產端的軟體

載點:https://github.com/shanghuyun-team/Shanghuyun-Production-side/releases

2.解開後的目錄


3.增加render.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
databases:
  - name: Shanghuyundb          # 資料庫服務名稱(可自訂)
    plan: free              # free / starter 等,免費版夠用
    databaseName: Shanghuyun    # 資料庫名稱
    user: Shanghuyun            # 使用者名稱(Render 會自動產生密碼)

services:
  - type: web
    name: Shanghuyun-Production-Side           # Web Service 名稱
    env: python             # Python 環境
    plan: free              # 免費方案
    region: singapore       # 建議選離台灣近的(如 singapore 或 oregon),跟資料庫同區域避免延遲
    buildCommand: pip install -r requirements.txt && python manage.py collectstatic --noinput
    startCommand: gunicorn core.wsgi:application --bind 0.0.0.0:$PORT
    # 如果你的專案資料夾是 Shanghuyun-Production-Side/core(內層),startCommand 改成:gunicorn Shanghuyun-Production-Side.wsgi:application ...

    envVars:
      - key: PYTHON_VERSION
        value: 3.14.1           # 或你的 Python 版本
      - key: SECRET_KEY
        generateValue: true   # Render 自動產生安全的 SECRET_KEY
      - key: DEBUG
        value: "False"
      - key: DATABASE_URL
        fromDatabase:
          name: mysitedb      # 對應上面的資料庫 name
          property: connectionString  # 自動注入 postgresql://... 格式
      - key: ALLOWED_HOSTS
        value: "*"            # 測試用,之後改成你的域名

4.在Github建Rep
Shanghuyun-Production-side

5.把軟體上傳到Github
  • 如果還沒 repo:
git init
git add .
git commit -m "Initial commit"
  • 建立 GitHub repo(private 或 public 都行)
  • push:
git remote add origin https://github.com/你的帳號/你的專案.git
git branch -M main
git push -u origin main

6. 建立新的藍圖

https://dashboard.render.com/blueprints




7.在Start Command中填入:
gunicorn core.wsgi:application --bind 0.0.0.0:$PORT

按下佈署鍵

8.佈署完成後,按下連結打開

2026年2月18日 星期三

[Django 6.0] 佈署Django到Render平台

1. 安裝虛擬環境工具
pip install virtualenvwrapper-win


2.建立虛擬環境

mkvirtualenv django_env

執行後畫面


環境都存在哪裡?

預設位置:

C:\Users\你的帳號\Envs


3.熟悉虛擬環境的指令

python --version → 確認是乾淨環境

deactivate → 離開

lsvirtualenv 或 workon → 看到 testenv 了嗎?

workon testenv → 再切回去


4.安裝Django

pip install django


5.製作安裝套件的文件requirements.txt

pip freeze > requirements.txt


6.初始化mysite Django 專案

django-admin startproject mysite


7.更換工作目錄
cd mysite

8.執行本地端網站
python manage.py runserver


9.打開瀏覽器
http://127.0.0.1:8000/

10.建立一個新應用程式

python manage.py startapp myapp


11.添加應用程式,mysite/mysite/settings.py
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
"""
Django settings for mysite project.

Generated by 'django-admin startproject' using Django 6.0.2.

For more information on this file, see
https://docs.djangoproject.com/en/6.0/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/6.0/ref/settings/
"""

from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/6.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-!mi(werx6fq32e)h4we%q(d5k=(=coxpx^ux9z!#pqv=*-il13'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'mysite.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'mysite.wsgi.application'


# Database
# https://docs.djangoproject.com/en/6.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}


# Password validation
# https://docs.djangoproject.com/en/6.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/6.0/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/6.0/howto/static-files/

STATIC_URL = 'static/'

12.建立網頁 mysite/templates/index.html 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <title>Hello Django on Render!</title>

    <link rel="stylesheet"
          href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css"
          integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk"
          crossorigin="anonymous">
</head>
<body>
<main class="container">
    <div class="row text-center justify-content-center">
        <div class="col">
            <h1 class="display-4">Hello World!</h1>
        </div>
    </div>
</main>
</body>
</html>


13.建立一個簡單的視圖,mysite/myapp/views.py

1
2
3
4
5
from django.shortcuts import render


def index(request):
    return render(request, 'index.html', {})

14.設定路徑,mysite/mysite/uels.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
"""
URL configuration for mysite project.

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/6.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from myapp import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index, name='index'),
]

15.重新啟動網站
python manage.py runserver

16.用render.yaml部署,放在mysite目錄下,和manage.py在同一個目錄。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
databases:
  - name: mysitedb          # 資料庫服務名稱(可自訂)
    plan: free              # free / starter 等,免費版夠用
    databaseName: mysite    # 資料庫名稱
    user: mysite            # 使用者名稱(Render 會自動產生密碼)

services:
  - type: web
    name: mysite            # Web Service 名稱
    env: python             # Python 環境
    plan: free              # 免費方案
    region: singapore       # 建議選離台灣近的(如 singapore 或 oregon),跟資料庫同區域避免延遲
    buildCommand: pip install -r requirements.txt && python manage.py collectstatic --noinput
    startCommand: gunicorn mysite.wsgi:application --bind 0.0.0.0:$PORT
    # 如果你的專案資料夾是 mysite/mysite(內層),startCommand 改成:gunicorn mysite.wsgi:application ...

    envVars:
      - key: PYTHON_VERSION
        value: 3.14.1           # 或你的 Python 版本
      - key: SECRET_KEY
        generateValue: true   # Render 自動產生安全的 SECRET_KEY
      - key: DEBUG
        value: "False"
      - key: DATABASE_URL
        fromDatabase:
          name: mysitedb      # 對應上面的資料庫 name
          property: connectionString  # 自動注入 postgresql://... 格式
      - key: ALLOWED_HOSTS
        value: "*"            # 測試用,之後改成你的域名

17.先把專案推到 GitHub
  • 如果還沒 repo:
git init
git add .
git commit -m "Initial commit"
  • 建立 GitHub repo(private 或 public 都行)
  • push:
git remote add origin https://github.com/你的帳號/你的專案.git
git branch -M main
git push -u origin main

18.建立新的藍圖
https://dashboard.render.com/blueprints


19.選擇包含您的藍圖的儲存庫,然後按一下「連線」。


20.命名後,按下部署鍵

21.部署過程,顯示:ModuleNotFoundError: No module named 'app'
在 Render Dashboard 修正 Start Command 登入 https://dashboard.render.com → 選你的 Web Service(mysite) 點 Settings(或 Edit) 找到 Start Command 欄位 改成:gunicorn mysite.wsgi:application

22.再度部署,部署成功後,瀏覽器訪問時,收到 400 Bad Request
127.0.0.1 - - [18/Feb/2026:08:20:57 +0000] "HEAD / HTTP/1.1" 400 143 ... 127.0.0.1 - - [18/Feb/2026:08:21:01 +0000] "GET / HTTP/1.1" 400 143 ...
這不是 Gunicorn 或 port 綁定問題,而是 Django 的安全檢查 觸發:你的 ALLOWED_HOSTS 設定沒包含 Render 給的域名(這裡是 mysite-1-p20l.onrender.com)。
Django 在 production 模式(DEBUG=False)下,會嚴格驗證 Host header。如果 Host 不匹配 ALLOWED_HOSTS,就直接回 400 Bad Request(不會給詳細錯誤頁面)。

23.修改mysite/mysite/setting.py
ALLOWED_HOSTS = [
    'mysite-1-p20l.onrender.com',   # 你的實際 Render URL(從 log 抄)
    '.onrender.com',                 # 萬用(wildcard),涵蓋所有子域名,測試超方便
    'localhost',                     # 本地開發用,可選
    '127.0.0.1',
]

24.重新把修改後的程式,上傳到Github
git add mysite/settings.py
git commit -m "Fix ALLOWED_HOSTS for Render deployment"
git push origin main

25.自動重新部署
Render 會自動偵測 push → 自動 redeploy(如果開了 auto-deploy)
也可以用手動 redeploy(如果等不及)
去 Render Dashboard → 你的服務(mysite-1-p20l)→ Manual Deploy → Deploy latest commit

26.開啟網站