1. 程式人生 > >廖雪峰python實戰專案_Day1

廖雪峰python實戰專案_Day1

#! app.py

import logging;logging.basicConfig(level=logging.INFO)

import asyncio, os, json, time
from datetime import datetime

from aiohttp import web

def index(request):                                         #檢視函式
    return web.Response(body=b'<h1>Awesome</h1>')

@asyncio.coroutine
def init(loop):
    app = web.Application(loop=loop)                        #1 1 建立app例項
    app.router.add_route('GET','/',index)                   #2 把URL和index函式註冊到app.router
    srv = yield from loop.create_server(app.make_handler(),'127.0.0.1',9000)        #3 用aiohttp.RequestHandlerFactory 作為協議簇建立套接字,可以用 make_handle() 建立。
    logging.info('server start at http://127.0.0.1:9000...')
    return srv

loop = asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()

這是基於asyncio和aiohttp搭建的Web骨架。

首先,獲取協程 、執行協程

loop = asyncio.get_event_loop()                    #獲取最小協程單元 
loop.run_until_complete(init(loop))                #放入任務(Task)init(loop)
loop.run_forever()                                  #一直執行

然後,看非同步協程任務

@asyncio.coroutine
def init(loop):
    app = web.Application(loop=loop)                        #1 1 Application,建構函式 def __init__(self, *, logger=web_logger, loop=None,router=None, handler_factory=RequestHandlerFactory,middlewares=(), debug=False):
    app.router.add_route('GET','/',index)                   #2 把URL和index函式註冊到app.router
    srv = yield from loop.create_server(app.make_handler(),'127.0.0.1',9000)        #3 用aiohttp.RequestHandlerFactory 作為協議簇建立套接字,可以用 make_handle() 建立。
    logging.info('server start at http://127.0.0.1:9000...')
    return srv
我把init(loop)函式稱為非同步協程任務,非同步指這個函式是非同步IO操作,協程任務指這個函式返回值用途是放置於協程中執行的。
app = web.Application(loop=loop)     接受一個訊息迴圈作為引數,返回一個app例項
app.router.add_route('GET','/',index)   新增route到router,請求方式是GET,URL是'/',則交給檢視函式index處理。
 srv = yield from loop.create_server(app.make_handler(),'127.0.0.1',9000)    loop.create_server()建立一個非同步協程任務:建立一個繫結127.0.0.1和9000埠的TCP服務。A coroutine which creates a TCP server bound to host and port.The return value is a Server object which can be used to stopthe service.

使用了@asyncio.coroutine和yield from的組合,表示這個函式是一個coroutine(非同步協程任務),可以放到loop中執行的。

最後,看檢視函式(index)

所謂檢視函式,就是處理URL的函式。從URL到檢視函式,稱之為路由。

def index(request):                                         #檢視函式
    return web.Response(body=b'<h1>Awesome</h1>')
index函式接受一個request,返回web.Response物件。看一些Response物件的建構函式:def __init__(self, *, body=None, status=200,reason=None, text=None, headers=None, content_type=None,charset=None)*標示了之後的是可變參量。body:HTML中的body部分;status:狀態碼,200標示正常;headers:HTML的頭部。

body=b'<h1>Awesome</h1>'  b''標示了body接受的是bytes變數

相關推薦

雪峰python實戰專案_Day1

#! app.py import logging;logging.basicConfig(level=logging.INFO) import asyncio, os, json, time from datetime import datetime from aioh

python實戰專案第五天

PS: 決定還是堅持寫部落格記錄一下比較好。 今天的實戰內容是編寫web框架,如果之前的知識不熟悉的話確實看不大懂。在這裡奉上自己的理解以及幫助理解的相關資料和文件。 Web框架 首先我們要知道web框架是什麼東西,它到底要怎麼實現。這一點廖大在web開發的WSGI介面、使用web框架這兩篇文章裡已

python實戰專案第四天

資料庫操作問題 參考: 用命令列建立MySQL資料庫 菜鳥教程——MySQL (尤其是這一篇:MySQL管理) 啟動MySQL時出現問題 資料庫操作這塊先會用就行。過程中難免遇到很多奇奇怪怪的問題,我把我自己解決的問題發上來。 首先就是廖大的test有一些小錯誤,我根據評論區以及自己的理解改了一下:

python實戰專案第三天

為了看懂這一天的原始碼,翻了之前好多的文章才算是勉強理解了一點。 什麼是orm 廖大在這本文中並沒有很詳細的介紹,那是因為之前就已經告訴過我們了。使用元類這一篇中在介紹元類的同時也介紹了一點orm。 ORM全稱“Object Relational Mapping”,即物件-關係對映,

python實戰專案第二天

這一篇是補的,有些資料我也忘了當時查來幹嘛。但是那麼辛苦的查,總要記錄下來。 不過經過那一天的學習,我不那麼怕閱讀文件了,而且有些文件寫得真的非常清晰易讀; Asyncio 介紹 參考 Python 的非同步 IO:Asyncio 簡介 aiohttp官方文件 aiohttp官方文

python實戰專案第六天

今天的比較簡單,我就直接把原始碼上自己不容易搞懂的寫一下吧。 merge()方法 def merge(defaults, override): r = {} for k, v in defaults.items(): if k in override:

雪峰Python教程實戰篇-Day5

async def handle_url_xxx(request):        ...    第二步,傳入檢視函式的引數要自己從request中獲取:url_param = request.match_info['key']    query_params = parse_qs(request.query

雪峰Python學習筆記——使用元類

ram form 創建對象 字典 comm params int name 學習筆記 元類(MetaClasses) 元類提供了一個改變Python類行為的有效方式。 元類的定義是“一個類的類”。任何實例是它自己的類都是元類。 class demo(object):

雪峰python摘錄4

生成 結果 api cnblogs fun 相關 cap object log 1、直接作用於for循環的對象統稱為可叠代對象:Iterable。 可以被next()函數調用並不斷返回下一個值的對象稱為叠代器:Iterator。 2、生成器都是Iterator對象,但

雪峰python摘錄5

新的 aps ret col 出錯 簽名 一個 復制 div 1、假設我們要增強now()函數的功能,比如,在函數調用前後自動打印日誌,但又不希望修改now()函數的定義,這種在代碼運行期間動態增加功能的方式,稱之為“裝飾器”(Decorator)。 2、由於log()是一

雪峰python摘錄6

rar art ocs 沒有 概念 註意 表示 tar 完全 1 def now(): 2 print(‘hello‘) 3 4 import functools 5 6 def log(func): 7 @functools.wraps

雪峰python摘錄二輪2

預編譯 父類 空字符串 返回 提交 update fetch 出了 運行時 1 >>> def set_age(self, age): # 定義一個函數作為實例方法 2 ... self.age = age 3 ... 4 >>>

Python 學習從雪峰 Python教程開始

https info python 學習 分享 圖片 png wiki src ima https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 Python 學習

雪峰--python教程:筆記三

[1] 小寫 對象 gin collect 內置函數 返回值 python 字典 通過 高級特性:前面我們簡單的聊了一下Python的數據類型、語句和函數,接下來來聊聊Python的高級特性 切片:取一個list、tuple、str一部分內容是很常見的操作,而切片操作,可以

網站搭建筆記精簡版---雪峰WebApp實戰-Day10:使用者登陸(下)筆記

這裡的登陸頁面轉換花了好長時間。 網頁登陸完整日誌分析(重要) 此處講述了具體signin.html的javascrip部分如何進行相應,寫出了相關函式的呼叫順序。花了好長時間理清楚思路。已調通的具體程式碼參考該網頁。或參考之前的博文。 Signin.html GET ‘/sig

網站搭建筆記精簡版---雪峰WebApp實戰-Day10:使用者註冊(上)筆記

網站搭建筆記精簡版-廖雪峰教程學習@[三川水祭] 僅作學習交流使用,將來的你會感謝現在拼命努力的自己!!! 這裡搞了兩天終於給調通了!!! 這裡的流程是首先瀏覽器輸入http://localhost:9000/,進入主頁面,點選右上角註冊,__base.html中通過連結跳轉到http:

網站搭建筆記精簡版---雪峰WebApp實戰-Day9:編寫API筆記

什麼是web API? 如果一個URL返回的不是HTML,而是機器能直接解析的資料,這個URL就可以看成是一個Web API。 編寫API有什麼好處呢? 由於API就是把Web App的功能全部封裝了,所以,通過API操作資料,可以極大地把前端和後端的程式碼隔離,使得後端程式碼易

網站搭建筆記精簡版---雪峰WebApp實戰-Day8:構建前端筆記

前面已經構建好MVC,可以進行視覺化,但是,老醜了,因此需要CSS等進行美化一下。這樣形容一下,html為網頁的骨架,JavaScript為網頁的肌肉,css為網頁的衣服。 模板下載 感謝強大的網際網路,我們可以通過這裡找到已經寫好的強大的CSS框架。它具備完善的響應式佈局,漂亮的U

網站搭建筆記精簡版---雪峰WebApp實戰-Day7:編寫MVC筆記

網站搭建筆記精簡版-廖雪峰教程學習@[三川水祭] 僅作學習交流使用,將來的你會感謝現在拼命努力的自己!!! 在前幾天的課程中,已經編寫完了ORM資料庫處理封裝框架、web框架和配置檔案。接下來將處理MVC,進行程式碼的啟動。即對上一節中編寫的handlers.py檔案進行重新編寫,即當遇

網站搭建筆記精簡版---雪峰WebApp實戰-Day6:編寫配置檔案筆記

網站搭建筆記精簡版-廖雪峰教程學習@[三川水祭] 僅作學習交流使用,將來的你會感謝現在拼命努力的自己!!! 我們在部署webapp時候需要讀取配置檔案,配置檔案中包含主機名、密碼和埠等配置資訊。廖老師在第6天的程式碼中編寫了三個檔案,分別是config_default.py、config