You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Hy开发Django:如何让Django自动识别指定.hy文件替代.py文件

让Django直接识别Hy文件的优雅解决方案

嘿,刚好我也折腾过用Hy写Django项目,完全懂你不想用“py文件导入hy文件”这种折中方案的心情!下面就给你分享几个直接让Django加载.hy文件的方法,都是亲测有效的:

核心思路:让Python识别Hy模块

Django本质上是通过Python的导入机制加载settings、urls这些核心文件的,所以只要让Python能直接导入.hy模块,Django自然就能识别它们。Hy本身已经提供了导入钩子,我们只需要在Django启动的最早期激活它就行。

步骤1:修改Django入口文件,激活Hy导入器

首先找到项目根目录的manage.py,把它改成下面这样——重点是在导入Django相关代码前,先加载Hy的导入逻辑:

import sys
import os
from pathlib import Path

# 先激活Hy的导入钩子,让Python能识别.hy文件
sys.path.append(str(Path(__file__).resolve().parent))
import hy
hy.importer._initialize()

# 下面是Django的原始启动代码,不用改
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
try:
    from django.core.management import execute_from_command_line
except ImportError as exc:
    raise ImportError(
        "Couldn't import Django. Are you sure it's installed and "
        "available on your PYTHONPATH environment variable? Did you "
        "forget to activate a virtual environment?"
    ) from exc
execute_from_command_line(sys.argv)

如果是部署用的wsgi.py或asgi.py,也要做同样的修改,在导入Django应用前先加载Hy:

# wsgi.py示例
import hy
hy.importer._initialize()

import os
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
application = get_wsgi_application()

步骤2:把原.py文件改成.hy并改写内容

现在你可以直接把那些Django要求的文件重命名为.hy后缀,然后用Hy语法改写:

示例1:settings.hy

把myproject/settings.py改成myproject/settings.hy,比如:

;; 基础配置
(setv DEBUG True)
(setv SECRET_KEY "your-super-secret-key-here")
(setv ALLOWED_HOSTS ["localhost" "127.0.0.1"])

;; 应用配置
(setv INSTALLED_APPS
      ["django.contrib.admin"
       "django.contrib.auth"
       "django.contrib.contenttypes"
       "django.contrib.sessions"
       "django.contrib.messages"
       "django.contrib.staticfiles"
       ;; 你的自定义应用
       "myapp"])

;; 中间件等其他配置...
(setv 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"])

示例2:urls.hy

把myproject/urls.py改成myproject/urls.hy,路由写法如下:

(require django.urls)
(require django.contrib.admin)

(setv urlpatterns
      [(django.urls.path "admin/" django.contrib.admin.site.urls)
       (django.urls.path "" (django.urls.include "myapp.urls"))
       ;; 其他路由规则
       ])

示例3:Hy版管理命令

把app/management/commands/my_management_command.py改成my_management_command.hy,写法如下:

(require django.core.management.base)
(require django.core.management)

;; 继承Django的BaseCommand
(class MyHyCommand [django.core.management.base.BaseCommand]
  ;; 可选:添加命令帮助文本
  (setv help "A management command written in Hy!")

  ;; 核心处理方法
  (defn handle [self *args **options]
    (. self stdout write "Hello from Hy management command!\n")))

;; 必须把Command类暴露出来,Django才能识别
(setv django.core.management.commands.my_management_command.Command MyHyCommand)

步骤3:验证运行

现在直接执行python manage.py runserver,Django会自动加载你的.hy配置文件和命令,完全不需要再用py文件中转导入了!

注意事项

  • 确保已经安装Hy:pip install hy,建议用和Django、Python版本兼容的Hy版本(比如最新稳定版)
  • 模块结构要和原来保持一致:比如管理命令必须放在app/management/commands/目录下,文件名(不含后缀)要和原来一样,Django会自动扫描这个目录下的所有可导入模块(包括.hy)
  • IDE可能不会自动识别.hy文件为Python模块,这时候可以给IDE装Hy语法插件(比如VSCode的Hy Language Support),不影响实际运行

内容的提问来源于stack exchange,提问作者lsusr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:01:47