计划
1、 完整的go web项目
2、 分析数据,抽离数据
3、 完善注册接口,设计模式加持
4、 代码自动化生成
5、 后续优化
6、 借用devopsxp项目对项目进行设计模式的改造
Install
快速安装
cd examples/sample && go run main.go
全功能
cd examples/allinone && go run example.go
Tutorial
首先使用github.com/lflxp/djangolang很简单,下面是一个Demo
package main
import (
"github.com/lflxp/djangolang"
"time"
"github.com/gin-gonic/gin"
)
type Demotest2 struct {
Id int64 `xorm:"id pk not null autoincr" name:"id" search:"true"`
Country string `json:"country" xorm:"varchar(255) not null" search:"true"`
Zoom string `json:"zoom" xorm:"varchar(255) not null"`
Company string `json:"company" xorm:"varchar(255) not null"`
Items string `json:"items" xorm:"varchar(255) not null"`
Production string `json:"production" xorm:"varchar(255) not null"`
Count string `json:"count" xorm:"varchar(255) not null"`
Serial string `json:"serial" xorm:"varchar(255) not null" search:"true"`
Extend string `json:"extend" xorm:"varchar(255) not null"`
Files string `xorm:"file" name:"file" verbose_name:"上传文件" colType:"file"`
Times time.Time `xorm:"times" name:"times" verbose_name:"时间" colType:"time" list:"true" search:"true"`
}
func init() {
djangolang.RegisterAdmin(new(Demotest2))
}
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.Redirect(301, "/admin/index")
})
djangolang.RegisterControllerAdmin(r)
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
高级功能展示
package main
import (
"crypto/tls"
"crypto/x509"
"github.com/lflxp/djangolang"
"github.com/lflxp/djangolang/middlewares"
ctls "github.com/lflxp/djangolang/tls"
"github.com/lflxp/djangolang/utils"
"fmt"
"net/http"
"os"
"os/signal"
"github.com/gin-contrib/gzip"
"github.com/gin-gonic/gin"
log "github.com/go-eden/slf4go"
"github.com/skratchdot/open-golang/open"
)
var GinEngine *gin.Engine
type Args struct {
Host string
Port string
IsHttps bool
OpenBrowser bool
Auth struct {
Url string
IdentityKey string
Dev bool
}
}
func Run(args *Args) {
// gin.SetMode(gin.ReleaseMode)
GinEngine = gin.Default()
// 注册路由
GinEngine.Use(gin.Logger())
GinEngine.Use(gin.Recovery())
GinEngine.Use(middlewares.Cors())
GinEngine.Use(gzip.Gzip(gzip.DefaultCompression, gzip.WithExcludedPathsRegexs([]string{".*"})))
// GinEngine.Use(middlewares.NoRouteHandler)
GinEngine.GET("/health", middlewares.RegisterHealthMiddleware)
GinEngine.GET("/", func(c *gin.Context) {
c.Redirect(301, "/admin/index")
})
Registertest(GinEngine)
djangolang.RegisterControllerAdmin(GinEngine)
log.Infof("ip %s port %s", args.Host, args.Port)
if args.Host == "" {
// instance.Fatal("Check Host or Port config already!!!")
args.Host = "0.0.0.0"
}
if args.Port == "" {
args.Port = "8002"
}
var server *http.Server
if args.IsHttps {
err := ctls.Refresh()
if err != nil {
panic(err)
}
pool := x509.NewCertPool()
caCeretPath := "ca.crt"
caCrt, err := os.ReadFile(caCeretPath)
if err != nil {
panic(err)
}
pool.AppendCertsFromPEM(caCrt)
server = &http.Server{
Addr: fmt.Sprintf("%s:%s", args.Host, args.Port),
Handler: GinEngine,
TLSConfig: &tls.Config{
ClientCAs: pool,
ClientAuth: tls.RequestClientCert,
},
}
} else {
server = &http.Server{
Addr: fmt.Sprintf("%s:%s", args.Host, args.Port),
Handler: GinEngine,
}
}
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
go func() {
<-quit
log.Warn("receive interrupt signal")
if err := server.Close(); err != nil {
log.Fatal("Server Close:", err)
}
}()
var openUrl string
for index, ip := range utils.GetIPs() {
if args.IsHttps {
log.Infof("Listening and serving HTTPS on https://%s:%s", ip, args.Port)
} else {
log.Infof("Listening and serving HTTPS on http://%s:%s", ip, args.Port)
}
if index == 0 {
openUrl = fmt.Sprintf("%s:%s", ip, args.Port)
}
}
if args.IsHttps {
if args.OpenBrowser {
open.Start(fmt.Sprintf("https://%s", openUrl))
}
if err := server.ListenAndServeTLS("ca.crt", "ca.key"); err != nil {
if err == http.ErrServerClosed {
log.Warn("Server closed under request")
} else {
log.Fatalf("Server closed unexpect %s", err.Error())
}
}
} else {
if args.OpenBrowser {
open.Start(fmt.Sprintf("http://%s", openUrl))
}
if err := server.ListenAndServe(); err != nil {
if err == http.ErrServerClosed {
log.Warn("Server closed under request")
} else {
log.Fatalf("Server closed unexpect %s", err.Error())
}
}
}
log.Warn("Server exiting")
}
func main() {
args := Args{
IsHttps: true,
OpenBrowser: true,
Port: "9000",
}
Run(&args)
}
介绍
Django 是一款流行的 Python Web 框架,提供了丰富的功能和灵活的配置选项,使得开发者可以快速地构建高质量、可扩展的 Web 应用程序。而 Golang 版本的 Django 框架 Django-Golang,则是将 Django 框架用 Golang 语言重新实现的一个版本,具有更高的运行时性能和更好的并发支持。
Django-Golang 的特点:
-
高性能:Django-Golang 使用 Golang 语言编写,具有更高的运行时性能,可以快速地处理请求和响应。
-
并发支持:Django-Golang 支持并发编程,可以轻松地编写多线程程序,提高程序的并发性能。
-
灵活的配置:Django-Golang 提供了灵活的配置选项,开发者可以根据自己的需求进行自定义。
-
丰富的功能:Django-Golang 继承了 Django 框架强大的功能,包括 ORM、模板引擎、表单、管理员等功能。
安装 Django-Golang:
-
安装 Golang:可以从官方网站(https://golang.org/dl/)下载适合自己操作系统的安装包,然后按照官方文档的指引进行安装。
-
安装 Django-Golang:在命令行中输入以下命令即可:
go get github.com/django/golang-django
这将下载 Django-Golang 并将其安装到你的 Golang 环境中。
使用 Django-Golang:
- 创建一个新的 Django-Golang 项目:在命令行中输入以下命令即可:
django-golang-start myproject
这将创建一个新的 Django-Golang 项目,其中 myproject
是你的项目名称。
- 运行 Django-Golang 项目:在命令行中输入以下命令即可:
cd myproject
python manage.py runserver
这将启动 Django-Golang 项目,并在默认的端口 8000 上运行。
- 创建 Django-Golang 视图:在
myproject/views.py
文件中,可以定义 Django-Golang 视图,例如:
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello, Django-Golang!")
- 创建 Django-Golang 模板:在
myproject/templates
目录下,可以创建 Django-Golang 模板,例如:
<h1>{{ message }}</h1>
- 配置 Django-Golang 项目:在
myproject/settings.py
文件中,可以配置 Django-Golang 项目的各种参数,例如:
DEBUG = True
Django-Golang 的配置选项非常丰富,可以根据自己的需求进行自定义。此外,Django-Golang 还提供了丰富的第三方库支持,可以方便地集成第三方库到项目中,例如:数据库、缓存、队列等。
总结:Django-Golang 是一个将 Django 框架用 Golang 语言重新实现的高性能 Web 框架,具有更高的运行时性能和更好的并发支持,非常适合开发高质量、可扩展的 Web 应用程序。如果你想要使用 Golang 构建 Web 应用程序,Django-Golang 是一个不错的选择。