66 lines
3.0 KiB
Python
66 lines
3.0 KiB
Python
from django import forms
|
||
from plans.models import Plan
|
||
|
||
|
||
class AddDomainForm(forms.Form):
|
||
name = forms.CharField(label='主域名', max_length=253)
|
||
subdomains = forms.CharField(label='接入子域名(逗号分隔)', required=False, help_text='例如:www,static')
|
||
origin_host = forms.CharField(label='源站地址(域名或IP)', max_length=253)
|
||
origin_protocol = forms.ChoiceField(label='回源协议', choices=[('http', 'HTTP'), ('https', 'HTTPS')], initial='http')
|
||
origin_port = forms.IntegerField(label='回源端口', initial=80, min_value=1, max_value=65535)
|
||
plan = forms.ModelChoiceField(
|
||
label='套餐',
|
||
queryset=Plan.objects.filter(is_active=True, is_public=True, allow_new_purchase=True),
|
||
required=False
|
||
)
|
||
enable_websocket = forms.BooleanField(label='启用WebSocket', required=False, initial=False)
|
||
|
||
def clean(self):
|
||
cleaned = super().clean()
|
||
# 规范化子域名列表
|
||
subs_raw = cleaned.get('subdomains') or ''
|
||
subs = [s.strip() for s in subs_raw.split(',') if s.strip()]
|
||
cleaned['subdomains'] = subs
|
||
return cleaned
|
||
|
||
|
||
class DomainSettingsForm(forms.Form):
|
||
waf_enabled = forms.BooleanField(label='启用 WAF', required=False)
|
||
http3_enabled = forms.BooleanField(label='启用 HTTP/3', required=False)
|
||
logs_enabled = forms.BooleanField(label='启用实时日志', required=False)
|
||
websocket_enabled = forms.BooleanField(label='启用 WebSocket', required=False)
|
||
redirect_https_enabled = forms.BooleanField(label='强制 HTTP→HTTPS 跳转', required=False)
|
||
cache_rules_json = forms.CharField(label='缓存规则(JSON)', required=False, widget=forms.Textarea(attrs={'rows': 6}))
|
||
ip_whitelist = forms.CharField(label='IP 白名单(逗号分隔)', required=False, widget=forms.Textarea(attrs={'rows': 3}))
|
||
ip_blacklist = forms.CharField(label='IP 黑名单(逗号分隔)', required=False, widget=forms.Textarea(attrs={'rows': 3}))
|
||
page_rules_json = forms.CharField(label='页面规则(JSON)', required=False, widget=forms.Textarea(attrs={'rows': 6}))
|
||
|
||
def clean_cache_rules_json(self):
|
||
val = self.cleaned_data.get('cache_rules_json') or ''
|
||
if not val.strip():
|
||
return {}
|
||
import json
|
||
try:
|
||
return json.loads(val)
|
||
except Exception:
|
||
raise forms.ValidationError('缓存规则需为合法 JSON')
|
||
|
||
def clean_page_rules_json(self):
|
||
val = self.cleaned_data.get('page_rules_json') or ''
|
||
if not val.strip():
|
||
return {}
|
||
import json
|
||
try:
|
||
return json.loads(val)
|
||
except Exception:
|
||
raise forms.ValidationError('页面规则需为合法 JSON')
|
||
|
||
def clean_ip_whitelist(self):
|
||
val = self.cleaned_data.get('ip_whitelist') or ''
|
||
ips = [s.strip() for s in val.split(',') if s.strip()]
|
||
return ips
|
||
|
||
def clean_ip_blacklist(self):
|
||
val = self.cleaned_data.get('ip_blacklist') or ''
|
||
ips = [s.strip() for s in val.split(',') if s.strip()]
|
||
return ips |