树莓派搭建Django Web服务

最近工作忙碌,睡觉都不是很充足,实在有点忙不过来,业务上的需求一直压着技术,上面在年初就声明了今年注定是舍命狂奔,关键是忙还不能犯错,阿里的老同事也很无奈的说,为过程鼓掌,为结果买单,这可能就是阿里。
我最近买了树莓派,很希望好好利用做点事情,但是也没太多时间去搞,最近也是因为某人想要做个简单的网页,在树莓派上搭建一个外网可以访问的网页,虽然页面简单,但是包括了整个链路上的所有部分,这篇文章也是总结一下一些基本的原理和一些需要注意的问题。

  • raspberry部分
    树莓派是英国剑桥的element4组织推动的一个计划,就是希望给广大的教育事业提供廉价的完整的计算机解决方案。树莓派的硬件不够强悍,但是包含了完整的处理器与内存,甚至包含蓝牙和usb和无限模块,摄像头模块等等,最有意思的还提供了GPIO这个可以连接外部的机械部件,例如led灯,这样可以完成很多扩展。
    树莓派的资料很多,但是看过去看过来还是https://www.raspberrypi.org/官网 的资料最齐全,也强烈建议尽量阅读英文原文,这个树莓派还有线下聚会,统一命名为Raspberry Jam。杭州在西湖科技馆也有树莓派实验室,在meetup上有定期的组织聚会。
    树莓派自带的官网系统为raspbian,是debain的一个分支,所以linux基本通用,熟悉ubuntu的朋友肯定用起来很得心应手,包管理工具都是apt-get安装。树莓派的编码默认中文会乱码,这个需要处理下。后面django也报了这个问题,unix的编码文件一般为/etc/default/locales文件。
    最开始http端口是没打开的,需要使用ufw工具来完成防火墙的设置,这个工具的文档很齐全,可以非常灵活简单的配置防火墙,需要搭建MySQL和web等服务都需要暴露一些端口什么的,可以用到。
    树莓派一些设置可以用raspi-config命令,例如打开ssh,打开摄像头等等。
  • web 部分
    网站开发需要的浏览器和web服务器,浏览器发送 http请求到web服务器,然后产生相应,这个相应可能是多种格式,可能是个页面也可能是个JSON,甚至是个文件。http请求包含的请求头就是携带了这个信息,能接收什么类型的响应。浏览器请求一个url,然后到服务器端,后端返回一个页面,这个页面包含了html , css , javascrip。这也是一个网页最基本的三个部分。html代表页面上的元素,例如列表,表单,图片,链接等等。css就是控制这些元素如何展示的,例如居中,长宽度等等。javascrip就是交互的脚本语言,它能够控制这些元素的动作,做一些简单的交互,例如点击一个按钮然后弹出框显示。或则是点击一个按钮就发送一个http请求,这些都是由javascript来控制的。
    Django是Python实现的web服务器,它也是监听服务器的http端口并封装成python识别的对象
    安装django : pip install django
    用django-admin start project [项目名字]
    它的目录结构如下:
    这里写图片描述

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")
]

这样在浏览器访问http://xxxxx/getWorkerInfoByName就能访问到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格式。还有一些其他问题欢迎给我留言。

猜你喜欢

转载自blog.csdn.net/micro_hz/article/details/80054701
今日推荐