{"id":21007913,"url":"https://github.com/lflxp/djangolang","last_synced_at":"2026-07-01T23:31:50.910Z","repository":{"id":216406713,"uuid":"739224849","full_name":"lflxp/djangolang","owner":"lflxp","description":"A framework similar to Django developed based on golang language ","archived":false,"fork":false,"pushed_at":"2024-02-01T04:45:18.000Z","size":1663,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-19T17:51:50.778Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lflxp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-01-05T04:04:41.000Z","updated_at":"2024-01-12T04:52:41.000Z","dependencies_parsed_at":"2024-11-19T09:10:51.397Z","dependency_job_id":"2ecb9e48-3639-4446-97af-3440a1548681","html_url":"https://github.com/lflxp/djangolang","commit_stats":null,"previous_names":["lflxp/djangolang"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/lflxp/djangolang","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lflxp%2Fdjangolang","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lflxp%2Fdjangolang/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lflxp%2Fdjangolang/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lflxp%2Fdjangolang/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lflxp","download_url":"https://codeload.github.com/lflxp/djangolang/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lflxp%2Fdjangolang/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35027340,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-01T02:00:05.325Z","response_time":130,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-19T09:10:42.470Z","updated_at":"2026-07-01T23:31:50.887Z","avatar_url":"https://github.com/lflxp.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 介绍\n\n![first](assets/first.png)\n![second](assets/second.png)\n![three](assets/three.png)\n\n`本项目的目的是利用django的admin设计模式 + gin + golang实现应用的快速搭建和使用，免去搭建底层框架的困扰，自动生成CRUD的界面，节能增效`\n\nDjango 是一款流行的 Python Web 框架，提供了丰富的功能和灵活的配置选项，使得开发者可以快速地构建高质量、可扩展的 Web 应用程序。而 Golang 版本的 Django 框架 Django-Golang，则是将 Django 框架用 Golang 语言重新实现的一个版本，具有更高的运行时性能和更好的并发支持。\n\nDjango-Golang 的特点：\n\n1. 高性能：Django-Golang 使用 Golang 语言编写，具有更高的运行时性能，可以快速地处理请求和响应。\n\n2. 并发支持：Django-Golang 支持并发编程，可以轻松地编写多线程程序，提高程序的并发性能。\n\n3. 灵活的配置：Django-Golang 提供了灵活的配置选项，开发者可以根据自己的需求进行自定义。\n\n4. 丰富的功能：Django-Golang 继承了 Django 框架强大的功能，包括 ORM、模板引擎、表单、管理员等功能。\n\n安装 Django-Golang：\n\n1. 安装 Golang：可以从官方网站(https://golang.org/dl/)下载适合自己操作系统的安装包，然后按照官方文档的指引进行安装。\n\n2. 安装 Django-Golang：在命令行中输入以下命令即可：\n```\ngo get https://github.com/lflxp/djangolangexamples\n```\n这将下载 Django-Golang 并将其安装到你的 Golang 环境中。\n\n使用 Django-Golang：\n\n1. djangolangexamples 项目包含一个Demo App，里面包含一个一对多的模型和完整的Swagger API：在命令行中输入以下命令即可：\n```\ncd djangolangexamples\ngo mod tidy\ngo run main.go\n```\n这将创建一个新的 Django-Golang 项目，其中 `myproject` 是你的项目名称。\n\n2. 设置 Django-Golang 项目配置：`main.go`中配置如下：\n```\n\t// 是否开启https访问\n\tisHttps bool = true\n\t// 设置服务host\n\tHost string = \"0.0.0.0\"\n\t// 设置服务端口\n\tPort string = \"8000\"\n\t// 是否开启自动打开浏览器\n\tOpenBrowser bool = true\n```\n这将启动 Django-Golang 项目，并在默认的端口 8000 上运行。\n\n3. 创建 Django-Golang 接口注册和其它配置：在 `main.go` 文件中，可以定义 Django-Golang 配置，例如：\n```\n\t// 设置跨域设置\n\tr.Use(middlewares.Cors())\n\t// 设置恢复策略\n\tr.Use(gin.Recovery())\n\t// 设置日志\n\tr.Use(gin.Logger())\n\t// 设置健康检查接口\n\tr.GET(\"/health\", middlewares.RegisterHealthMiddleware)\n\t// 设置swagger\n\tmiddlewares.RegisterSwaggerMiddleware(r)\n\t// 注册demo和vpn接口\n\tdemo.RegisterDemo(r)\n\tdemo.RegisterVpn(r)\n\t// 设置自动跳转\n\tr.GET(\"/\", func(c *gin.Context) {\n\t\tc.Redirect(301, \"/admin/index\")\n\t})\n\n\t// 注册admin接口\n\tdjangolang.RegisterControllerAdmin(r)\n\t// r.Run() // listen and serve on 0.0.0.0:8080 (for windows \"localhost:8080\")\n\n\t// 配置gin优雅启动\n\tvar server *http.Server\n```\n\n4. Admin视图适配，表结构字段解析\n\n以下是djangolangexamples包含的两个数据结构： Demo和Vpn\n\n```go\ntype Demo struct {\n\tId         int64     `xorm:\"id pk not null autoincr\" name:\"id\" search:\"true\"`\n\tCountry    string    `json:\"country\" xorm:\"varchar(255) not null\" search:\"true\"`\n\tZoom       string    `json:\"zoom\" xorm:\"varchar(255) not null\"`\n\tCompany    string    `json:\"company\" xorm:\"varchar(255) not null\"`\n\tItems      string    `json:\"items\" xorm:\"varchar(255) not null\"`\n\tProduction string    `json:\"production\" xorm:\"varchar(255) not null\"`\n\tCount      string    `json:\"count\" xorm:\"varchar(255) not null\"`\n\tSerial     string    `json:\"serial\" xorm:\"varchar(255) not null\" search:\"true\"`\n\tExtend     string    `json:\"extend\" xorm:\"varchar(255) not null\"`\n\tFiles      string    `xorm:\"file\" name:\"file\" verbose_name:\"上传文件\" colType:\"file\"`\n\tFile2      string    `xorm:\"file2\" name:\"file2\" verbose_name:\"上传文件2\" colType:\"file\"`\n\tType       string    `xorm:\"type\" name:\"type\" verbose_name:\"类型\" search:\"false\" colType:\"textarea\"`\n\tDetail     string    `xorm:\"detail\" name:\"detail\" verbose_name:\"VPN信息\" list:\"false\" search:\"false\" o2m:\"vpn|id,vpn\" colType:\"o2m\"`\n\tTimes      time.Time `xorm:\"times\" name:\"times\" verbose_name:\"时间\" colType:\"time\" list:\"true\" search:\"true\"`\n}\n\ntype Vpn struct {\n\tId   int64  `xorm:\"id notnull unique pk autoincr\" name:\"id\"`\n\tVpn  string `xorm:\"vpn\" name:\"vpn\" verbose_name:\"Vpn字段测试\" list:\"true\" search:\"true\"`\n\tName string `xorm:\"name\" name:\"name\" verbose_name:\"姓名\" list:\"true\" search:\"false\"`\n\tIp   string `xorm:\"ip\" name:\"ip\" verbose_name:\"ip信息\" list:\"true\" search:\"false\"`\n}\n\n```\n\n其中注释字段解析字段如下：\n\n|  字段名   | 字段描述 | 类型  | 是否必须 | 显示效果 | 备注 |\n|  ----  | ----  | ---- | ---- | ---- | ---- |\n| xorm  | 数据库字段 | string | 是 | 无 | xorm框架定义数据库字段，`id notnull unique pk autoincr` 表示id字段 不为空 唯一性 主键 字增字段 |\n| json | json字段显示 | string | 否 | 无 | - |\n| name  | 显示字段 | string | 否 | 无 | admin自动框架表单字段 |\n| verbose_name | 表单显示名称 | string | 否 | 无 | form表单显示名称 |\n| search  | 是否支持搜索 | bool | 否 | 无 | 设置是否是table页面搜索框支持字段 |\n| colType  | 字段类型 | string | 无 | 表单字段类型，有：`textarea` `file` `o2m` `int,int16,int64` `string` `text` `select` `radio` `multiselect` `time` `o2o` `m2m` `password` |\n| list  | 是否表格显示 | bool | 否 | 无 | 表格字段是否显示 |\n| o2m  | 一对多关系设置 | string | 否 | 无 | 设置一对多的表及pk外键，如： vpn|id,vpn |\n\nDjango-Golang 的配置选项非常丰富，可以根据自己的需求进行自定义。此外，Django-Golang 还提供了丰富的第三方库支持，可以方便地集成第三方库到项目中，例如：数据库、缓存、队列等。\n\n总结：Django-Golang 是一个将 Django 框架用 Golang 语言重新实现的高性能 Web 框架，具有更高的运行时性能和更好的并发支持，非常适合开发高质量、可扩展的 Web 应用程序。如果你想要使用 Golang 构建 Web 应用程序，Django-Golang 是一个不错的选择。\n\n# Install \n\n## 快速安装\n\n\u003e cd examples/sample \u0026\u0026 go run main.go\n\n## 全功能\n\n\u003e cd examples/allinone \u0026\u0026 go run example.go\n\n## 完整演示项目\n\n参考 [djangolangexamples](https://github.com/lflxp/djangolangexamples)\n\n# 功能详情\n\n首先使用github.com/lflxp/djangolang很简单，下面是一个Demo\n\n```go\npackage main\n\nimport (\n\t\"github.com/lflxp/djangolang\"\n\t\"time\"\n\n\t\"github.com/gin-gonic/gin\"\n)\n\ntype Demotest2 struct {\n\tId         int64     `xorm:\"id pk not null autoincr\" name:\"id\" search:\"true\"`\n\tCountry    string    `json:\"country\" xorm:\"varchar(255) not null\" search:\"true\"`\n\tZoom       string    `json:\"zoom\" xorm:\"varchar(255) not null\"`\n\tCompany    string    `json:\"company\" xorm:\"varchar(255) not null\"`\n\tItems      string    `json:\"items\" xorm:\"varchar(255) not null\"`\n\tProduction string    `json:\"production\" xorm:\"varchar(255) not null\"`\n\tCount      string    `json:\"count\" xorm:\"varchar(255) not null\"`\n\tSerial     string    `json:\"serial\" xorm:\"varchar(255) not null\" search:\"true\"`\n\tExtend     string    `json:\"extend\" xorm:\"varchar(255) not null\"`\n\tFiles      string    `xorm:\"file\" name:\"file\" verbose_name:\"上传文件\" colType:\"file\"`\n\tTimes      time.Time `xorm:\"times\" name:\"times\" verbose_name:\"时间\" colType:\"time\" list:\"true\" search:\"true\"`\n}\n\nfunc init() {\n\tdjangolang.RegisterAdmin(new(Demotest2))\n}\n\nfunc main() {\n\tr := gin.Default()\n\tr.GET(\"/\", func(c *gin.Context) {\n\t\tc.Redirect(301, \"/admin/index\")\n\t})\n\n\tdjangolang.RegisterControllerAdmin(r)\n\tr.Run() // listen and serve on 0.0.0.0:8080 (for windows \"localhost:8080\")\n}\n```\n\n高级功能展示\n\n```go\npackage main\n\nimport (\n\t\"crypto/tls\"\n\t\"crypto/x509\"\n\t\"github.com/lflxp/djangolang\"\n\t\"github.com/lflxp/djangolang/middlewares\"\n\tctls \"github.com/lflxp/djangolang/tls\"\n\t\"github.com/lflxp/djangolang/utils\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/signal\"\n\n\t\"github.com/gin-contrib/gzip\"\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/skratchdot/open-golang/open\"\n)\n\nvar GinEngine *gin.Engine\n\ntype Args struct {\n\tHost        string\n\tPort        string\n\tIsHttps     bool\n\tOpenBrowser bool\n\tAuth        struct {\n\t\tUrl         string\n\t\tIdentityKey string\n\t\tDev         bool\n\t}\n}\n\nfunc Run(args *Args) {\n\t// gin.SetMode(gin.ReleaseMode)\n\tGinEngine = gin.Default()\n\n\t// 注册路由\n\n\tGinEngine.Use(gin.Logger())\n\tGinEngine.Use(gin.Recovery())\n\tGinEngine.Use(middlewares.Cors())\n\tGinEngine.Use(gzip.Gzip(gzip.DefaultCompression, gzip.WithExcludedPathsRegexs([]string{\".*\"})))\n\t// GinEngine.Use(middlewares.NoRouteHandler)\n\tGinEngine.GET(\"/health\", middlewares.RegisterHealthMiddleware)\n\tGinEngine.GET(\"/\", func(c *gin.Context) {\n\t\tc.Redirect(301, \"/admin/index\")\n\t})\n\tRegistertest(GinEngine)\n\tdjangolang.RegisterControllerAdmin(GinEngine)\n\tslog.Info(\"ip %s port %s\", args.Host, args.Port)\n\n\tif args.Host == \"\" {\n\t\t// instance.Fatal(\"Check Host or Port config already!!!\")\n\t\targs.Host = \"0.0.0.0\"\n\t}\n\n\tif args.Port == \"\" {\n\t\targs.Port = \"8002\"\n\t}\n\n\tvar server *http.Server\n\tif args.IsHttps {\n\t\terr := ctls.Refresh()\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\n\t\tpool := x509.NewCertPool()\n\t\tcaCeretPath := \"ca.crt\"\n\n\t\tcaCrt, err := os.ReadFile(caCeretPath)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\n\t\tpool.AppendCertsFromPEM(caCrt)\n\n\t\tserver = \u0026http.Server{\n\t\t\tAddr:    fmt.Sprintf(\"%s:%s\", args.Host, args.Port),\n\t\t\tHandler: GinEngine,\n\t\t\tTLSConfig: \u0026tls.Config{\n\t\t\t\tClientCAs:  pool,\n\t\t\t\tClientAuth: tls.RequestClientCert,\n\t\t\t},\n\t\t}\n\t} else {\n\t\tserver = \u0026http.Server{\n\t\t\tAddr:    fmt.Sprintf(\"%s:%s\", args.Host, args.Port),\n\t\t\tHandler: GinEngine,\n\t\t}\n\n\t}\n\n\tquit := make(chan os.Signal)\n\tsignal.Notify(quit, os.Interrupt)\n\n\tgo func() {\n\t\t\u003c-quit\n\t\tslog.Warn(\"receive interrupt signal\")\n\t\tif err := server.Close(); err != nil {\n\t\t\tslog.Error(\"Server Close:\", err)\n\t\t}\n\t}()\n\n\tvar openUrl string\n\tfor index, ip := range utils.GetIPs() {\n\t\tif args.IsHttps {\n\t\t\tslog.Info(\"Listening and serving HTTPS on https://%s:%s\", ip, args.Port)\n\t\t} else {\n\t\t\tslog.Info(\"Listening and serving HTTPS on http://%s:%s\", ip, args.Port)\n\t\t}\n\n\t\tif index == 0 {\n\t\t\topenUrl = fmt.Sprintf(\"%s:%s\", ip, args.Port)\n\t\t}\n\t}\n\tif args.IsHttps {\n\t\tif args.OpenBrowser {\n\t\t\topen.Start(fmt.Sprintf(\"https://%s\", openUrl))\n\t\t}\n\t\tif err := server.ListenAndServeTLS(\"ca.crt\", \"ca.key\"); err != nil {\n\t\t\tif err == http.ErrServerClosed {\n\t\t\t\tslog.Warn(\"Server closed under request\")\n\t\t\t} else {\n\t\t\t\tslog.Error(\"Server closed unexpect %s\", err.Error())\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif args.OpenBrowser {\n\t\t\topen.Start(fmt.Sprintf(\"http://%s\", openUrl))\n\t\t}\n\t\tif err := server.ListenAndServe(); err != nil {\n\t\t\tif err == http.ErrServerClosed {\n\t\t\t\tslog.Warn(\"Server closed under request\")\n\t\t\t} else {\n\t\t\t\tslog.Error(\"Server closed unexpect %s\", err.Error())\n\t\t\t}\n\t\t}\n\t}\n\n\tslog.Warn(\"Server exiting\")\n}\n\nfunc main() {\n\targs := Args{\n\t\tIsHttps:     true,\n\t\tOpenBrowser: true,\n\t\tPort:        \"9000\",\n\t}\n\tRun(\u0026args)\n}\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flflxp%2Fdjangolang","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flflxp%2Fdjangolang","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flflxp%2Fdjangolang/lists"}