HTTP Status 狀態代表的意思

瀏覽器接收到伺服器的回應後,都會自動去判讀網頁的狀態,其中的 Http Status代碼的意思如下:

最簡單狀態碼如下:

  • 1xx訊息: 這一類型的狀態碼,代表請求已被接受,需要繼續處理。
  • 2xx成功: 這一類型的狀態碼,代表請求已成功被伺服器接收、理解、並接受。
  • 3xx重新導向: 這類狀態碼代表需要用戶端採取進一步的操作才能完成請求。通常,這些狀態碼用來重新導向, 
  • 4xx用戶端錯誤: 這類的狀態碼代表了用戶端看起來可能發生了錯誤,妨礙了伺服器的處理。
  • 5xx伺服器錯誤: 表示伺服器無法完成明顯有效的請求。]這類狀態碼代表了伺服器在處理請求的過程中有錯誤或者異常狀態發生,也有可能是伺服器意識到以當前的軟硬體資源無法完成對請求的處理。

簡單狀態碼如下:

  • 200 伺服器回應Data成功。
  • 206 取得片段資料,Http Request 中有的 Range 屬性,可以指定要取得那一段Bytes數。
  • 301 目標網頁移到新網址(永久轉址)。
  • 302 暫時轉址
  • 304 已讀取過的圖片或網頁,由瀏覽器緩存 (cache) 中讀取。
  • 401 需身分驗證,如 SSL key  or htaccess pasword。
  • 403 沒有權限讀取,可能是 IP 被阻檔或是伺服器限制。
  • 404 伺服器未找到目標網址,檔案不存在。
  • 408 Client Request  timeout
  • 411 沒有指定  content-length,使用 POST 傳送參數時,必須指定參數的總長度
  • 414 URL 太長導致伺服器拒絕處理。
  • 500 伺服器發生錯誤 : 可能是 htaccess 有錯
  • 503 伺服器當掉 : maybe is code dump
  • 505 不支此 HTTP 版本

 更多狀態碼如下:

https://zh.wikipedia.org/zh-tw/HTTP%E7%8A%B6%E6%80%81%E7%A0%81

回Django Web 程式設計主目錄

文章標籤

stanley 發表在 痞客邦 留言(0) 人氣()

 

Django Web 程式設計目錄列表

 

Django 筆記(一)-Hello World 

Django 筆記(二)-Views & Templates

Django 筆記(三)-Models & Database 

Django 筆記(四)-總結記錄

HTTP Status 狀態列表及說明 

HTTP Request 方法: Get 和 Post

Django 筆記(五)-Django遇見Javascript和JQuery

Django 筆記(六)- Templates深入研究 

 

參考文件:

(1) w3schoolds : https://www.w3schools.com/

 

 

 

文章標籤

stanley 發表在 痞客邦 留言(0) 人氣()

  2017.08.25 

在上三篇文章中我們己經使用了URLS、Templates、 Views、Models及Database所有元件,這篇我們記錄一個最基本的範例程式,這個程式連結所有的元件,從使用者Reguest資料到資料表內容呈現到瀏覽器上。我們只使用一個簡單的資料表,而使用者的需求為列出資料表的內容。這個記錄不再作過多的文字說明,有問題請回主目錄點選以前的文件說明。


開啓Web Service  
     開啓一個CMD視窗,切換路徑到專案manage.py 所在目錄,執行

python manage.py runserver

程式範例

在urls.py

from django.conf.urls import include, url
from django.contrib import admin
from kaok.views import list

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^list/$', list),
]

在models.py

from django.db import models

class kaok(models.Model):
    song_no = models.CharField(max_length=6)
    songer = models.CharField(max_length=30)
    song_name = models.CharField(max_length=60)
    song_lang = models.CharField(max_length=20)
    song_kind = models.CharField(max_length=20)
    song_words = models.CharField(max_length=3)

在views.py  

from django.shortcuts import render
from django.template.loader import get_template
from django.http import HttpResponse
from kaok.models import kaok


def list(request):
    data = kaok.objects.all()   
    return render(request, 'list.html',{'datas':data})

在 /templates下新增 list.html 


<!doctype html>
<html>
    <head>
    </head>
    <body>資料表內容<br>
     {% for item in datas %}
      <tr>
        <td>{{ item.song_name }}</td>       
        <td>{{ item.songer }}</td>
      </tr><br>
     {% endfor %}
    </body>
</html>

 在瀏覽器輸入 http://127.0.0.1:8000/list,可以看到頁面如下

Django

有這個程式範例我們後續就可以再發展比較複雜的Web程式了。

回Django Web 程式設計主目錄

 

 

 

文章標籤

stanley 發表在 痞客邦 留言(0) 人氣()

 2017.08.24 

資料來源: (1)https://djangobook.com/the-django-book/

      在上二篇文章中我們己經使用了URLS、Templates、 Views,這篇文章我們將介紹Models設定及Database的使用,並且整合之前的元件,我們仍舊要從到我們的MTV架構開始談起,為什麼呢,我個人覺得這個圖及架構就是Django的設計精神,有些設定及設計流程要思考這個圖就能理解一大半了。從圖中可以看到Models介於Views及資料庫之間,如果我們不要Models 層將資料庫設定及資料全放在Views是否可以,聰明的你一定猜到了,從下圖的資料訊流顯示那一定是可以的,是否有這種的設計方式呢,當然是有像傳統的網頁設計就是使用這樣的架構設計,他們不用管什麼三層式架構,資料層,企業邏輯層,資料呈現層全部混在一起全部放在一個檔案內,這種方式當然也是可以的。而這種方式目前在市場上也是佔有一席之地的。為什麼呢? 因為全部程式使用的元件比較少,整個架構及流程設計會比較簡單。但後續程式的維護修改會比較有問題。那就是當換資料庫時全部有關係到資料庫設定的Views就要全部都翻過一次。

(資料來源:http://blog.easylearning.guru/implementing-mtv-model-in-python-django/)

 回到Models的問題,我可以先破題的說Models 記錄的內容就是tables 及tables之間關連性的內容。記住這字話後面的內容設定,程式設計將會變的簡單。

資料庫設定


首先我們先開啓一個資料庫,以供後面的Models及程式用
打開 settings.py檔案,預設資料庫是sqlite
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

我們使用預設資料庫,所以不做任何異動,你可以依你的資料庫類型改變設定。另外在settings.py內尋找
INSTALLED_APPS ,把你的app name 加入,讓Django知道那些是我們會有到的app。
例如我想要設計一個KTV 點歌的web app,所以我加入了kaok 到settings.py內。如果其他預設的app 不需要可以加上#

 

INSTALLED_APPS = (
    #'django.contrib.admin',
    #'django.contrib.auth',
    #'django.contrib.contenttypes',
    #'django.contrib.sessions',
    #'django.contrib.messages',
    #'django.contrib.staticfiles',
    'kaok',
)


定義Django Models內容

from django.db import models

class kaok(models.Model):
    song_no = models.CharField(max_length=6)
    songer = models.CharField(max_length=30)
    song_name = models.CharField(max_length=60)
    song_lang = models.CharField(max_length=20)
    song_kind = models.CharField(max_length=20)
    song_words = models.CharField(max_length=3)

我們的例子比較簡單,只有一個Model 和 數個文字型態的欄位,在這個地方你可以把Model物件=table。
(1)Model 物件名字就是table名字。
(2)定義欄位名、欄位型態、最大長度。(其他欄位型態我們例子没用到,請看下面比較複雜的範例)
(3)定義Models之間的關連性(我們例子没用到,請看下面比較複雜的範例)

from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()   #URL欄位型態

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()  #Email欄位型態

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author) # book 有1對多 authors 關係
    publisher = models.ForeignKey(Publisher) # 它是一個Publisher的ForeignKey
    publication_date = models.DateField() #日期欄位型態

更多欄位型態訊息請參考https://www.webforefront.com/django/modeldatatypesandvalidation.html
更多模式關係訊息請參考https://www.webforefront.com/django/setuprelationshipsdjangomodels.html


產生資料庫內容

 一但我們建立了model, 我們須要去建立新的或更新舊資料庫table內容,所以執行下面指令

python manage.py syncdb

 

系統會開始建立table, 如果是第一次執行系統會依INSTALLED_APPS 的內容開始產生table和一個superuser

Creating tables ...
Creating table django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table kaok_kaok

You just installed Django's auth system, which means you don't have any superuse
rs defined.
Would you like to create one now? (yes/no):yes
Username (leave blank to use 'XXX'): root
Email address: XXXX@gmail.com
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

假如你有異動INSTALLED_APPS 的內容,請再次執行 syncdb 以同步資料庫內容。
系統會在專案目錄下產生一個 db.sqlite3檔案。

 

與Model互動

當table 建立後你可能須要對table內容對S(查詢)、I(插入)、D(刪除)、U(更新),你可以利用指令去完成資料的操縱,或者你也可以用後面Admin介面去操控資料,更或者你可以使用熟悉的資料庫管理工具應該也可以操控資料,所以有興趣可以找一下其他資料。

python manage.py shell

 

Admin介面

amin是Djanog中內建的一個app,如果你没有移除它的話相信你在建table時就會看到它的table了。

要使用Admin介面要新增註冊資料至Admin.py,新增內容如下

 

from django.contrib import admin
from .models import kaok
admin.site.register(kaok)

 在瀏覽器輸入 http://127.0.0.1:8000/admin,可以看到管理後台的登入頁面:

如剛才無設定superuser,請用下指令新增

python manage.py createsuperuser

其他資料庫管理工具
  
我也下載了其他的資料庫管理工具,SQLiteStudio 事實證明使用其他的工具也是操縱所有的資料表內容。我利用這個軟體新增了二筆資料以作做後續程式測試使用。

回Django Web 程式設計主目錄

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

文章標籤

stanley 發表在 痞客邦 留言(0) 人氣()

 2017.08.22 

資料來源: (1)https://djangobook.com/the-django-book/

Django Templates

      在上篇文章中我們己經成功了呈現了字串"Hello World",簡單地說我們己經可以Web Server作互動了
下面我們要更進一步了解Django Templates的使用方式。故事仍舊要從到我們的MTV架構開始談起。
(資料來源:http://blog.easylearning.guru/implementing-mtv-model-in-python-django/)

在上篇文章中我們的Hello World 網頁使用到了最短路徑,所以使用到了URLS, Views二個元件,其實你也可以使用Python+HTML這種方式土法煉鋼打造你的網站,但是它存在一些問題。
例如可以在view中同時使用Python+HTML去反應使用者的要求。


def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)

任何網頁或資料庫設定改變需要改變相對應的python程式碼,我們希望設計改變可以不需要改變Python程式碼。Python and HTML 是二種不同的設計原則,所以為了有效的設計及使用我們使用Tempaltes分開html及python的方式去設計網頁。

 Django Templates 基本概念

Templates依據定義是一個文字字串文件,它的用途是為了分開文件中的資料呈現,在Templates會定義Templates tags去規範文件如何呈現,通常Templates是用來儲存HTML的程式碼。從下面的例子學習如何使用templates 。

 

<html>
<head>
    <title>Ordering notice</title>
</head>
<body>
    <h1>Ordering notice</h1>
    <p>Dear {{ person_name }},</p>
    <p>Thanks for placing an order from {{ company }}. It's scheduled to ship on {{ s\
hip_date|date:"F j, Y" }}.</p>
    <p>Here are the items you've ordered:</p>
    <ul>
        {% for item in item_list %}
        <li>{{ item }}</li>{% endfor %}
    </ul>
    {% if ordered_warranty %}
    <p>Your warranty information will be included in the packaging.</p>
    {% else %}
    <p>
        You didn't order a warranty, so you're on your own when the products inevitably stop working.
    </p>
    {% endif %}
    <p>Sincerely,<br />{{ company }}</p>
</body>
</html>
  •  Templates 大部份儲存HTML程式碼,再加上
  • {{ person_name }} 是一個變數值
  • {% if ordered_warranty %}是 template tag,它比較類似python的程式碼。例如 python的if , for 程式碼
  •  {{ ship_date|date:"F j, Y" }} 是 template filter,它可用來很方更地改變變數的呈現格式。
  • context 是一個 name->value 對應 (類似Python的dictionary),它傳值給 template。
  • template renders 是一個從context取代變數值到指定的模板。
  • 更多template tag 和 template filter 參考https://djangobook.com/basic-template-tags-filters/
  • Advanced 參考https://djangobook.com/advanced-templates/
  • 建議先連結上面二個連結預習一下所有的tag & Filter

 

Templates in Views

如何將Templates整合至Views中,有下面幾種整合方式
(1)Templates 字串匯入

from django.template import Template, Context
from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    t = Template("<html><body>It is now {{ current_date }}.</body></html>")
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)
  • 第一行匯入Templates 的Context,其內部包含許多定義好的變數及變數值。
  • html 程式碼不長,利用Templates 字串方式

(2)Templates 文件匯入

 

from django.template import Template, Context
from django.http import HttpResponse
import datetime

def current_datetime(request):

    now = datetime.datetime.now()
    # Simple way of using templates from the filesystem.
    # This is BAD because it doesn't account for missing files!
    fp = open('\users\djangouser\templates\mytemplate.html')
    t = Template(fp.read())
    fp.close()

    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)

 

  • 利用open 檔案的方式匯入。
  • 缺點是檔案或路徑不對時會產生錯誤。

(3)指定Templates 文件存放目錄匯入

打開 settings.py 然後在\mysite 建一個 \templates 目錄並加入


TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'templates'),
)

 #-------------------------------------------

好了, 現在回到我們的主題view,總共要修改三步驟

(1)用編輯器修改在\mysite_project\settings.py 新增



TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'templates'),
)

(2)用編輯器修改在\mysite_project\mysite_app下的view.py

#mysite\mysite\views.py

from django.shortcuts import render
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    return render(request, 'current_datetime.html', {'current_date': now})

第一個參數為: request 物件
第二個參數:使用的template 檔名 
第三個參數:Context 物件,如空白,則為空Context

(3)在\mysite_project\mysite_app下建一個\templates 子目錄,並且在這個目錄下編寫一個current_datetime.html 檔案

內容如下


<html>
    <body>
        It is now {{ current_date }}
    </body>
</html>

特別注意: 如你的網頁要顯示中文,這個檔案格式要存成UTF8格式。

 

Views 和 Templates 整合測試

在瀏覽器輸入 http://127.0.0.1:8000/time/,你會看到網頁顯示現在時間

  成功了嗎,如不成功再回頭看看那裡有問題,應該不會很困難。

另外利用這個機會改一下語言及時區,修改settings.py 檔案內設定為

LANGUAGE_CODE = 'zh-TW'
TIME_ZONE = 'Asia/Taipei'

回Django Web 程式設計主目錄



 

 

 

 

 

    

 

 

 

 

 

 

 

文章標籤

stanley 發表在 痞客邦 留言(0) 人氣()

2017.08.21 

資料來源: (1)https://www.tutorialspoint.com/django/index.htm
              (2)Writing your first Django app, part 1
              (3)https://djangobook.com/the-django-book/

我們在前面己經安裝好了Portable Python 2.7.6.1後,在這個套件內有一個Django套件,而Django套件可以做什麼呢?

本篇用來記錄Django程式設計過程

什麼是Django ? 簡單地說Django就是用來開發設計Web的程式語言,各位讀者可以想像它就是 Web service架站+ASP(PHP)。
個人認為在專案開發中應用程式可分為GUI程式設計及Web程式設計,兩種應用程式使用類似但不同的設計框架,上層的框架架構或者有些不同,
但在下層的元件使用卻有些類似,但不管如何Django是一種可以用python語言來開發web 應用程式的設計架構。

MTV 架構 ( Model–Template–View )

Django 同樣使用了類似 MVC 的架構,只是在定義和解釋上略為不同,稱為 MTV ( Model–Template–View ),
首先我們要透過下面這張圖來了解其運作方式,這部份對於web程式設計是很重要的
(資料來源:http://blog.easylearning.guru/implementing-mtv-model-in-python-django/)

Model層是存取資料元件,而Template層是資料呈現層次,存放html等語法,view 是企業邏輯層,存放while if等指令。 
最基本地流程如下,

  1. 瀏覽器送出 request(要求)URLS
  2. Django 依據 URL configuration 分配至對應的 View
  3. View 進行操作或其他運算,並回傳一個Response(回應) 物件
  4. 瀏覽器依據 Response(回應) 物件顯示網頁畫面

其他的比較複雜的流程要依應用程式的複製度而加入不同的元件,例如網站需要使用到資料庫時我們就要加入model 層次的元件負責資料庫存取的工作。

檢查你的django和版本 

  
    python -m django --version
  

開始你的第一個Project

開一個cmd視窗,切換到 app/Scripts 所在目錄,在這個目錄下有一個django-admin.py 檔案

執行下面指令

  
    python django-admin.py startproject  <mysite name>
  

執行完後會產生下面的目錄結構

 mysite/
      manage.py
      mysite/
          __init__.py
          settings.py
          urls.py
          wsgi.py
  • manage.py: 一個命令列的公用程式,而這個公用程式可以用不同的方式與Django 專案互動,詳細設定方式在django-admin and manage.py.
  • 內層 mysite/ 目錄是你的專案Python套件,它的名稱為程式中需要匯入的名稱 (e.g. mysite.urls)。
  • 內層mysite/__init__.py: 一個空檔案,而這個檔案告訴Python,更多訊息請參考more about packages
  • 內層mysite/settings.py: Django 專案的設定及配置,如果這個application會被其它projects用到或透過django的database程式架構,
    那要在settings.py當中設定database的相關資訊,透過django的程式架構,如果後端要更換資料庫系統會比較方便,可能改設定就好。
  • 內層mysite/urls.py: Django 專案的URL宣告,負責網站的路由。如果有多個applications,把所有的對應放在一起可能有些混亂,所以django網站上的tutorial建議在建立一個 server_name/app_name/urls.py 檔,然後在 server_name/server_name/urls.py 當中來引用。更多訊息請參考URL dispatcher.
  • 內層mysite/wsgi.py: 一個為WSGI-compatible web servers to serve your project的進入點.更多訊息請參考 How to deploy with WSGI

決定Project Web 應用程式類型

在Django中,一個project即是一個Web應用程式,Project 要依據不同的工作型態而產生不同的目錄結構,而設定方式利用manage.py後的參數來操控不同的應用程式架構。使用方式如下:

  • python manage.py migrate : 建立一個資料庫方案,執行 python manage.py migrate,會根據application的設定來建立資料庫。更多訊息請參考Django settings
  • python manage.py runserver [port]: 開始一個web server
  • python manage.py startapp appname: 為專案建立一個新的app 應用程式
  • python manage.py help : 列出manage.py 所有用的指令

 

(1)建立你的第一個 app

 一個app 是一個 Web應用程式,而web應用程式可做一個投票系統,一個志工系統..等等,而一個專案可以包括數個app
建立app 指令如下:

  python manage.py startapp app_name 

執行完後會產生下面的目錄結構 

app name /
           __init__.py
          admin.py
          models.py

          view.py
          test.py 

 

(2)開啓你的第一個Web Server 

  
    python manage.py runserver
  

c:\python\App\Scripts\prj>python manage.py runserver
Validating models...

0 errors found
August 22, 2017 - 10:13:31
Django version 1.6.2, using settings 'prj.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

它會在你的本機開一個port 8000的web server,打開你的瀏覽器,輸入網址 http://127.0.0.1:8000/ ,你應該可以看到這個Welcome to Django 的歡迎畫面: 

 

(3)準備遇見你的Hello World View

 

我們開始在瀏覽器上呈現最簡單地訊息顯示,顯示出Hello World,,其中資料流程如下: 

  • 瀏覽器送出 HTTP request
  • Django 依據 URL configuration 分配至對應的 View
  • View 進行資料庫的操作或其他運算,並回傳 HttpResponse 物件
  • 瀏覽器依據 HTTP response 顯示網頁畫面

(3.1)建立Hello World 的 View

請把 view 看成一個 function,輸入 HttpRequest 物件,並回傳 HttpResponse 物件,大致說明如下:

  • 收到 HttpRequest 參數: Django 從網頁接收到 request 後,會將 request 中的資訊封裝產生一個 HttpRequest 物件,並當成第一個參數,傳入對應的 view function。

  • View 處理完後回傳一個 HttpResponse 物件: HttpResponse 物件裡面包含:

    • HttpResponse.content
    • HttpResponse.status_code …等訊息

所以請編輯你的app name / 下的view.py 內容如下:

  # kaok/views.py


from django.http import HttpResponse def hello_world(request): return HttpResponse("Hello World!")

 以上程式就是:

  1.  django.http 模組中引用 HttpResponse 類別
  2. 定義 hello_world 這個 view
  3.  hello_world 被呼叫時,輸入一個HttpRequest 物件,而回傳一個包含字串 Hello World!  HttpResponse 物件。

(3.2)Django URL 設定

 下一步即是要讓Django 知道URL 與 view 的對應關係。例如:當我們在瀏覽 http://127.0.0.1:8000/hello/ 時 ,hello_world() 這個 view function 要能夠被執行。而這個對應關係就被定義在 urls.py。

編輯你的mysite/ 下的urls.py 內容如下:

  # kaok/urls.py

from django.conf.urls import include, url
from django.contrib import admin
from kaok.views import hello_world #Import view functions from kaok.app hello_world
 
urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^hello/$', hello_world),
]

 

以上程式透過 url() function 傳入兩個參數 regex, view

  url(regex, view)

 

  • regex -- 定義的 URL 規則
    • 規則以 regular expression(正規表示式)來表達
    • r'^hello/$' 代表的是 hello/ 這種 URL
  • view -- 對應的 view function
    • 指的是 hello_world 這個 view

    在這個URL 設定中必須使用到Regular Expressions,如果你没學過它,可能會不知道這是什麼東西,我個人建議花點時間去研究及熟悉它,它的功能很強很方便
學了它我保證你絕對不會後悔,很多地方或程式都有它的影子,如果現在不懂那就先複製-貼上吧!有興趣可看官方文件及找估狗大師了。

(3)測試 你的Hello World

在瀏覽器輸入 http://127.0.0.1:8000/hello/,你會看到網頁顯示我們在 HttpResponse 傳入的文字Hello World!。

 如能走到這個地步,表示你的一些基本環境己經可以工作了,下面我們將更進一步設計比較複雜的網站內容。

回Django Web 程式設計主目錄

 

文章標籤

stanley 發表在 痞客邦 留言(0) 人氣()

 

如何利用python 的Socket 來撰寫通程式

官方文件https://docs.python.org/2/howto/sockets.html
好站連接:(Server端)  http://www.binarytides.com/python-socket-programming-tutorial/


Server code

# -*- coding: big5 -*-

import socket                                       
from time import ctime

# create a socket object
serversocket = socket.socket(
         socket.AF_INET, socket.SOCK_STREAM)

# get local machine name
host = socket.gethostname()                          

port = 9999                                          

# bind to the port
serversocket.bind((host, port))                                 

# queue up to 5 requests
serversocket.listen(5)  

while True:
  print 'waiting for connection...'
  tcpTimeClientSock, addr = serversocket.accept()
  print '...connected from:', addr

  while True:
    data = tcpTimeClientSock.recv(1024)
    if not data:  break
    print data
    reply = 'OK...' + data
    tcpTimeClientSock.send('[%s] %s' % (ctime(), reply))
   
   
  tcpTimeClientSock.close()
serversocket.close()

#----------------------

Client code

# -*- coding: big5 -*-

import socket
import sys

colors = ['red', 'green']

host = socket.gethostname()   
port = 9999                   # The same port as used by the server
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))

while True:
  indata = raw_input('> ')
  if not indata:
      break
  sock.send(indata)
  data = sock.recv(1024)
  if not data:
      break
  print data
sock.close()

 

 

 

 

 

文章標籤

stanley 發表在 痞客邦 留言(0) 人氣()

 

園藝愛好者也能使用木棧板,因為它們是製作微型花園的好材料。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

stanley 發表在 痞客邦 留言(0) 人氣()

 2017.07.28 星期五

測量車子速度看起來應該簡單,但還是要實作才能發覺真正的問題,其實看別人做好像很簡單,但實際上也是很多程式碼要寫,要做到完善似乎也是不容易的。所以記錄下來,以作參考。
這個範例使用web server 去呈現轉速資料,要修改成自己能用的。

 

 

There are 2 methods for calculating speed using Python.

The first method is using "pre-defined interval".
The second method is using "calculated interval".

#---------------------------------------

CALCULATED INTERVAL METHOD


Using calculated interval method is better and more precise than pre-defined interval.
 (1)using the time.time() module in Python to precisely measure time duration of each interrupt interval.
(2)using add_event_detect() to take advantage of the GPIO pin interrupt event handler.
(3)useing one callback function called "calculate_elapse(channel)".
     This function will get called anytime interrupt event happens.

#-------公式----------------------------------
Round Per Minute (rpm) can be calculated using : rpm = 1/elapse * 60
where 1 is referring to 1 complete rotation and 60 is referring to 60 seconds.

circ_cm (wheel circumference) can be calculated using : 2 x pi x radius

dist_km (distance moved in km) can be calculated using : dist_km = circ_cm/100000

km_per_sec (speed in KM/s) calculated using: km_per_sec =  dist_km / elapse

km_per_hour (speed in KM/h) calculated using: km_per_hour =  km_per_sec * 3600

#-------------------------------

#!/usr/bin/python3
import RPi.GPIO as GPIO
from time import sleep
import time, math

dist_meas = 0.00
km_per_hour = 0
rpm = 0
elapse = 0
sensor = 12
pulse = 0
start_timer = time.time()

def init_GPIO(): # initialize GPIO
     GPIO.setmode(GPIO.BCM)
     GPIO.setwarnings(False)
     GPIO.setup(sensor,GPIO.IN,GPIO.PUD_UP)

def calculate_elapse(channel):              # callback function
      global pulse, start_timer, elapse
      pulse+=1                                           # increase pulse by 1 whenever interrupt occurred
      elapse = time.time() - start_timer        # elapse for every 1 complete rotation made!
      start_timer = time.time()                    # let current time equals to start_timer

def calculate_speed(r_cm):
     global pulse,elapse,rpm,dist_km,dist_meas,km_per_sec,km_per_hour
     if elapse !=0:                                        # to avoid DivisionByZero error
        rpm = 1/elapse * 60
        circ_cm = (2*math.pi)*r_cm               # calculate wheel circumference in CM
        dist_km = circ_cm/100000                  # convert cm to km
        km_per_sec = dist_km / elapse           # calculate KM/sec
        km_per_hour = km_per_sec * 3600    # calculate KM/h
        dist_meas = (dist_km*pulse)*1000     # measure distance traverse in meter
return km_per_hour

def init_interrupt():
     GPIO.add_event_detect(sensor, GPIO.FALLING, callback = calculate_elapse, bouncetime = 20)

if __name__ == '__main__':
init_GPIO()
init_interrupt()
while True:
calculate_speed(20)                          # call this function with wheel radius as parameter
  print('rpm:{0:.0f}-RPM kmh:{1:.0f}-KMH dist_meas:{2:.2f}m pulse:{3}'.format(rpm,km_per_hour,dist_meas,pulse))
sleep(0.1)

 

 

參考資料

Raspberry Pi based Speedometer using Hall Effect Sensor

Speed sensor calculation using Python

https://stackoverflow.com/questions/40738776/how-to-use-python-to-measure-speed-of-bike-like-a-digital-speedometer-using-a-r

 

文章標籤

stanley 發表在 痞客邦 留言(0) 人氣()

https://diyprojects.io/esp8266-web-server-tutorial-create-html-interface-connected-object/#A_simple_program_to_start

WiFi library

ESP8266 Tutorial Part I – Getting Started
ESP8266 Tutorial Part II – ESP8266 Hello Web Server with Arduino IDE

ESP8266 Tutorial Part III – Customise Your Web Server with Arduino

 

stanley 發表在 痞客邦 留言(0) 人氣()

Close

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

reload

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼