用Django创建一个简单的动态请求站点

目标

在数梅派上启动一个HTTP服务,通过 GPIO 接口控制继电器 (可以参考 使用RaspberryPi 的GPIO接口控制LED灯闪烁 ),从而控制电器的开关。这样可以随时随地控制电源开关。

如果想在任何地方都能控制数梅派GPIO这里有很多解决方案:

  • 使用花生壳这样在任何地方都可以访问一个私网里的IP了
  • 自己假设一个web服务器,数梅派轮循(pool)从服务器URL检查状态值,并通过GPIO同步设置到硬件状态
  • 使用共有的服务器,如 http://yeelink.net,我们可以通过yelink客户端,设置服务器上的状态值,数梅派可以通过yelink分配的唯一URL,查询这个状态值,并同步设置硬件状态。可参考:http://www.kankanews.com/ICkengine/archives/97226.shtml

下面的web服务可以直接放在数梅派上,也可以放在公共服务器上,它的作用只是提供HTTP控制接口。

下载演示代码

首先使用django-admin创建一个project

# django-admin.py startproject PowerManagement
# cd PowerManagement/
# ls
  manage.py  PowerManagement

启动服务

# python manage.py runserver example.com:80
# w3m http://example.com/

这时候访问网站展示的是一个默认的欢迎页面

下面我们来添加一个自己的首页

创建templates目录,并添加到settings.py
+++ b/PowerManagement/settings.py
@@ -26,6 +26,10 @@ TEMPLATE_DEBUG = True

 ALLOWED_HOSTS = []

+TEMPLATE_DIRS = (
+    './templates',
+)
+
更新URL响应方法
+++ b/PowerManagement/urls.py
@@ -9,4 +9,5 @@ urlpatterns = patterns('',
     # url(r'^blog/', include('blog.urls')),

     url(r'^admin/', include(admin.site.urls)),
+    url(r'^$', 'PowerManagement.views.home', name='home'),
 )
在views.py中实现响应方法,home.html需要在./templates目录添加
+++ b/PowerManagement/views.py
@@ -0,0 +1,4 @@
+from django.shortcuts import render_to_response
+
+def home(request):
+    return render_to_response('home.html')

添加新的model (Switch)

# python manage.py startapp Switch
# ls Switch/
  admin.py  __init__.py  models.py  tests.py  views.py
添加 子url解析文件
# vim ./Switch/urls.py
from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^getstate$', 'Switch.views.getstate', name='getstate'),
    url(r'^setstate$', 'Switch.views.setstate', name='setstate'),
)
把子url解析文件include到主urls.py
+++ b/PowerManagement/urls.py
@@ -10,4 +10,5 @@ urlpatterns = patterns('',

     url(r'^admin/', include(admin.site.urls)),
     url(r'^$', 'PowerManagement.views.home', name='home'),
+    url(r'^switch/', include('Switch.urls')),
 )
创建 Switch 类,其包含一个state 的属性
+++ b/Switch/models.py
@@ -1,3 +1,6 @@
 from django.db import models

+
+class Switch(models.Model):
+    state = models.IntegerField(default=0)
实现getstate/setstate方法
+++ b/Switch/views.py
@@ -1,3 +1,25 @@
 from django.shortcuts import render
+from django.shortcuts import render_to_response
+from django.http import HttpResponse
+from Switch.models import Switch

 # Create your views here.
+
+def getobj():
+    try:
+        s = Switch.objects.get()
+    except Exception:
+        s = Switch()
+        s.save()
+    return s
+
+def getstate(request):
+    s = getobj()
+    return HttpResponse('Switch state is (%d)' % s.state)
+
+def setstate(request):
+    s = getobj()
+    if request.GET.get('state', -1) > 0:
+        s.state = int(request.GET.get('state'))
+        s.save()
+    return HttpResponse('Set switch state to (%d)' % s.state)

然后把新的 model 更新到 INSTALLED_APPS,并同步数据库

+++ b/PowerManagement/settings.py
@@ -40,6 +40,7 @@ INSTALLED_APPS = (
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
+    'Switch',
 )

# python manage.py syncdb

启动服务

# python manage.py runserver example.com:8000

访问

# w3m http://example.com/switch/getstate

Switch state is (4)

# w3m http://example.com/switch/setstate?state=2

Set switch state to (2)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.