树莓派搭建Django Web服务
最近工作忙碌,睡觉都不是很充足,实在有点忙不过来,业务上的需求一直压着技术,上面在年初就声明了今年注定是舍命狂奔,关键是忙还不能犯错,阿里的老同事也很无奈的说,为过程鼓掌,为结果买单,这可能就是阿里。 我最近买了树莓派,很希望好好利用做点事情,但是也没太多时间去搞,最近也是因为某人想要做个简单的网页,在树莓派上搭建一个外网可以访问的网页,虽然页面简单,但是包括了整个链路上的所有部分,这篇文章也是总结一下一些基本的原理和一些需要注意的问题。
manage.py 就是启动django的文件,运行的命令也是python manage.py runserver就开启了服务器. settings里面配置了服务器的基本配置,例如默认的端口,允许访问的IP,还有浏览器请求的页面所在路径等等。 urls配置了请求的url和对应的函数的映射关系,一个请求过来了具体执行哪个函数,就是在这里配置。 默认不允许其他机器访问django(我也不太清楚为什么django要这样设置,可能还是为了安全吧).需要在settings.py里面添加:
ALLOWED_HOSTS = [*]
这个是代表能访问的ip,*就代表所有的其他机器。 templates包含
## 页面模版存放路径 TEMPLATE_DIRS = [ BASE_DIR + /pages/ ] TEMPLATES = [ { BACKEND: django.template.backends.django.DjangoTemplates, DIRS: [/Users/xxxxpages/], 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, ], }, }, ]
urls的配置
// getWorkerInfoByName为浏览器的请求路径,WorkerController.getWorkerInfoByName就对应这个WorkerController模块的方法 urlpatterns = [ path(admin/, admin.site.urls), path(hello/, test.index, name = "index"), path(page/, test.test_page, name = "page"), path(getWorkerInfoByName/, WorkerController.getWorkerInfoByName, name = "getWorkerInfoByName"), path(insertWorker/, WorkerController.insertWorker, name = "insertWorker") ]
这样在浏览器访问就能访问到WorkerController.getWorkerInfoByName,这其实就是请求的路由过程,这跟Java SpringMVC的 RequestMapping都一样的。 接下来介绍一下我自己定义的文件夹模块,controller统一为所有请求的路由函数。dao封装了数据库的访问,model为对应表的类。pages下面就对应页面。 在树莓派上只要遇到中文,Django就会报错,这个是因为python3使用unicode编码导致,要么去修改系统的编码都比较麻烦,最后最简单的办法就是启动服务的时候使用:
PYTHONIOENCODING=utf-8 python3 manage.py runserver 0.0.0.0:8080
可以不添加0.0.0.0:8080使用默认的8000端口. 如果需要在一个目录下面引用在父目录的另一个子目录,最简单的方法就是:
import sys sys.path.append("./xx/") import module_name
在path里面添加对应的目录名。然后再import,这里vscode无法识别的bug,不用管它的错误提示。
-
ngrok外网映射 在局域网内希望让外网可以访问,这就需要有公网ip,可以使用ngrok做映射,注册一个ngrok账号,然后下载./ngrok 8000就可以开启映射。然后去ngrok控制台就可以看到暴露的公网域名。 以上就是利用树莓派搭建Django web服务的主要问题,还有一些小问题都没记录,例如jquery的ajax总是不执行success,用postman工具发现请求返回正常json,发现jquery需要严格json格式。还有一些其他问题欢迎给我留言。