保護黃石國家公園周遭灰熊 美法官出手

摘錄自2018年9月25日中央社報導

美國聯邦法官今天(25日)下令將棲息在黃石國家公園內部及周遭的灰熊,重新列入瀕臨滅絕物種保護法(ESA)保護名單,阻擋40年多來首度開放在這個地區獵捕灰熊的計畫。

美國蒙大拿州密蘇拉(Missoula)聯邦地區法官克里斯坦森(Dana Christensen)與環保人士及美國原住民站在同一陣線,駁回美國魚類暨野生動物管理局(U.S. Fish and Wildlife Service)將灰熊從瀕危物種名單除名的決定。

環保人士主張,根據瀕臨滅絕物種保護法,對這些灰熊與蒙大拿州和下48州(Lower 48)的其他灰熊族群採取差別待遇,是生物學上靠不住且非法行為,法官也同意這類說法。

環保人士說,儘管灰熊數量有所回升,倘若沒有受到聯邦持續保護,牠們的復育情況就會受到影響。此外,氣候變遷導致灰熊食物供給出現變化和人為死亡率高,也對灰熊生存構成威脅。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

紐約氣候週活動 促緊急降低全球暖化

摘錄自2018年9月25日中央社報導

每年聯合國大會召開之際,多國元首和政府領袖同時舉行的「氣候週」今天(25日)開跑,他們敦促世界領袖緊急採取行動降低全球暖化。

波蘭12月將主辦聯合國氣候變化綱要公約第24次締約方會議(COP24),聯合國氣候首長艾斯皮諾薩(Patricia Espinosa)呼籲各國團結,支持2015年巴黎協定所訂規定,將全球暖化升溫限制在攝氏兩度以下。

艾斯皮諾薩表示,各國並未實現他們的承諾。並說:「各國目前依據巴黎協定做出的承諾,將使得全球溫度在2100年升高約三度。」

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

小三通海運與一般國際貿易有何不同?

小三通快遞通關作業有哪些?

統達能源宣布進軍中國大陸電動車市場

台灣統振集團旗下統達能源宣布,將聯合易能電網科技以及中國機車公司奔馬實業,共同進軍中國大陸電動車市場,以電動機車用鋰電池交換系統搶攻中國商機,最快將在2016年下半年於廣東、福建地區成立營運示範據點。

統達能源過去著重歐洲電動自行車店員市場開發,在歐洲已有10%市占率,本次為首度跨入電動機車電源的供應鏈。總經理楊模樺表示,合作夥伴易能電網科技整合了桶達的動力電池系統與台灣IBM的技術,打造「MIT(台灣製造)」的智能化電池交換服務系統,並已在台灣搭配電動機車實際上路。

奔馬實業去年在中國大陸共生產了20萬輛機車,帶來10億元人民幣的營收。本次與統達能源的合作,聚焦在電動機車與電池交換站營運事業。奔馬實業董事長湛玉娟認為,車店分離電池月租致的商業模式能透過電池交換服務系統的管理與遠端監控來提高電池之可靠性、安全性、壽命,降低營運商維護成本,並與物聯網概念結合。她相信,合作夥伴易能的電池交換系統將有效改善中國大陸電動機車的能源供給問題,也能改善電池環保管理問題。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※試算大陸海運運費!

Google、福特、沃爾沃、Uber等合作建立自動駕駛汽車聯盟

日前,Google 已經與福特,沃爾沃,Uber和Lyft合作建立一個自動駕駛汽車聯盟,將與立法者,監管機構協調工作,讓自動駕駛汽車產生安全性和社會效益。

Google 和福特這兩大有影響力的公司走到一起,絕對是自動駕駛汽車行業一大利好消息,它們的結盟,將引起監管部門的注意。現在,自動駕駛汽車行業廠商有技術和原型,進行了無數的試駕,同時也拿出了實際的自動駕駛汽車車型,但是不健全的法律和法規限制了自動駕駛汽車上路。

如果自動駕駛汽車撞向一座建築物或其它車輛,誰應該負責?是坐在車裡的乘客還是自動駕駛汽車廠商?這些類型的問題將由聯盟將與政策制定者進行處理。目前領導該聯盟的是美國國家公路交通安全管理局前官員大衛•斯特裡克蘭。這樣聯盟就可以從監管的角度來看待問題。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

騰勢2016年年底前將在中國建650個專屬充電樁

4月25日,騰勢在北京車展發佈全新的騰勢新動生活解決方案,宣佈在2016年年底前在全國建設650個騰勢專屬公共充電樁。針對有長途出行的車主,騰勢還將提供50%的折扣價格租用梅賽德斯-賓士C級轎車的福利。

為解決車主充電難的問題,騰勢將進一步在北上廣深等城市的大型商場、酒店、寫字樓和機場等交通樞紐建設騰勢專屬公共充電樁,預計2016年年底前在全國建設650個騰勢專屬公共充電樁。與此同時,騰勢服務網路在2015年擴大到了9個城市13家銷售服務網點,未來將在重點城市開設更多服務網點。

在質保方面,騰勢將為動力電池及關鍵零部件提供8年或15萬公里的保修期,為消費者提供無憂的售後保障服務。另外,騰勢還將開放新技術升級服務,騰勢車主可以進行軟體升級或部件升級。在移動應用方面,騰勢專屬App將提供更為智慧貼心的遠端操控功能,可實現智慧充電控制、車內設備控制、車輛狀態查詢以及一鍵尋車等功能。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

福特「Model E」向特斯拉與雪佛蘭宣戰!

福特(Ford)執行長 Mark Fields 於 4 月 28 日對外表示,福特正在開發能與特斯拉(Tesla) Model 3 與雪佛蘭(Chevrolet ) Bolt 純電動車匹敵的長程電動車,目標是要達到單次充電續航里程 200 英里,在越來越多車廠投入電動車製造的同時,福特打算「成為其中的佼佼者」,甚至是「坐上傲視群雄的位置」。此話一出,向電動車市場其他車廠宣戰的意味濃厚。

雖然 Fields 並未透露太多細節,但這還是福特高層第一次直接對外證實,公司正在研擬向特斯拉與雪佛蘭挑戰的電動車開發計畫。Fields 未提及確切的上市時間,僅表示該電動車將會取名為「Model E」,計畫將於 2019 年在福特本月初宣布要在墨西哥中部興建的新工廠進行組裝,該工廠預計於 2018 年投產。   有別於特斯拉 Model 3 及雪佛蘭 Bolt 為純電動車款,據研究公司 AutoForecast Solutions 指出,福特的 Model E 打算提供 3 種車型,包括油電混合動力車、插電式混合動力車與純電動車,且福特已經以 Model E 名稱申請商標註冊。   回溯至 2015 年 12 月,當時 Fields 曾對外宣布,福特將斥資 45 億美元推動電動車市場,要在 2020 年前,在產品陣容中,加入 13 款油電混合動力車或電動車型,且屆時福特所出產的車輛中,多達 40% 將會是電力驅動的車輛。   福特先前宣布將在 2017 年推出的電動車 Focus Electric 車型續航里程僅能達到 76 英里,即便將在今年秋季增加到 100 英里,不過,仍遠低於將於今年底推出的雪佛蘭 Bolt,以及預計 2 年內交車的特斯拉 Model 3 單次充電續航里程數。

(首圖來源: CC BY 2.0)

(本文授權轉載自《》─〈〉)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

小三通海運與一般國際貿易有何不同?

小三通快遞通關作業有哪些?

中國發佈EVOP電動汽車運營平臺 打造電動汽車網聯大腦

日前,中能工業智慧技術研究院發佈了EVOP電動汽車運營平臺,打造中國最強電動汽車網聯大腦。

從傳統意義上來說,電動汽車只是“行駛+充電”的物理組合,滿足人們最基本的代步需求;而EVOP在此基礎上,通過互聯網和智慧化平臺,將電動汽車和充電設備打造成為能源互聯網產業鏈的重要一環。

和其他智慧化汽車應用相比,EVOP平臺基於中國最強工業大腦DPEN而打造,將資料、資訊和互聯網相結合,讓電動汽車產業鏈變得更智慧。DPEN支持數千萬個採集節點。在DPEN的引領之下,源源不斷的資料進入EVOP平臺,分門別類進行存儲和分析,並通過互聯網傳遞到每一輛電動汽車或者充電設備上,指導設備智慧化、高效率運行,並實現充電網、互聯網、車聯網“三網融合”。

在充電端,EVOP可以輕鬆實現智慧充電功能,它可以即時檢測並調整充電狀態,加強電池的健康管理,引導智慧有序充電、計量計費,並讓車主通過手機隨時瞭解充電情況;而商業地產、物業管理公司、電動汽車廠商等運營商和服務商可以通過雲平臺實現充電樁和車載電池的智慧管理,提供良好的增值服務。

在行駛端,由EVOP平臺海量採集的資料經過精確梳理和分析,通過雲平臺提供給每一位車主,在EVOP營造的車聯網中智慧、高效、安全出行。人們不僅可以隨時瞭解車輛和電池的資訊,快速查詢身邊的充電設備、預約充電;也可以在EVOP的指導下獲得最佳行車路線和最佳能效使用方案;亦可以在EVOP的社交平臺中交流經驗、分享資訊、找到志同道合的朋友,享受 “大資料+互聯網”的時尚車生活。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

小三通物流營運型態?

※快速運回,大陸空運推薦?

django學習與實踐

Django簡介

​ Django是一個由Python寫成的開放源代碼的Web應用框架,它最初是被用來開發管理勞倫斯出版集團旗下的一些以新聞內容為主的網站,即CMS(內容管理系統)軟件。 並於2005年7月在 BSD 許可證下發布。這套框架是以比利時的吉普賽爵士吉他手 Django Reinhardt 來命名的。由於 Django 的是在一個快節奏的新聞編輯室環境下開發的,它的目的是使常見的 Web 開發任務,快速和容易。

Django官網:https://www.djangoproject.com/

Django中文網:https://www.django.cn

Django的框架模式

  • Django採用了MTV設計模式

    M Models 模型
    T Templates 模板
    V Views 視圖

Django是一個Web應用框架,他是如何處理請求和響應的

URL ( urls.py )請求調度,當有緩存頁面的時候直接返回內容。
視圖函數( view.py )執行所請求的操作,通常包括讀寫數據庫。
模型( models.py )定義了 Python 中的數據並與之交互。通常包含在一個關係數據庫( MySQL、PostgreSQL SQLite 等),其他數據存儲是可能的( XML、文本文件、LDAP、等)。
請求執行任務后,視圖返回一個 HTTP 響應對象(通常是經過數據處理的一個模板)。可選的:視圖可以保存一個版本的 HTTP 響應對象,返回攜帶一個時間戳,來告訴瀏覽器這個視圖的更新時間。
模板通常返回 HTML 頁面。Django 模板語言提供了 HTML 的語法及邏輯。

安裝

第一行和第三行都可以隨便使用

網絡不好用第三行

pip install Django==2.1
#用國內的鏡像網站,如下
pip install Django==2.1 -i https://pypi.douban.com/simple

導入Django模塊

import django
print(django.get_version())
#結果:
2.1

基本配置

常用命令

查看django版本
python -m django --version
#結果
2.1
創建項目命令,項目名稱是mysite
django-admin startproject mysite
創建應用程序命令,確保在manage.py文件時在同一個目錄
#如果我們在項目外面,先要進入項目里
cd mysite
#windows使用dir查看當前在哪裡,如果有manage.py就代表我們可以正確使用下面的命令
#創建應用程序
python manage.py startapp app01

啟動django

python manage.py runserver
#默認端口是8000
#使用上面的命令就可以了,下面不經常用
#改端口
python manage.py runserver 8080
#改訪問地址和端口
python manage.py runserver 0.0.0.0:8080

生成模型變化遷移文件

python manage.py makemigrations

運行模型遷移文件遷移到數據庫中

python manage.py migrate

創建管理用戶

python manage.py createsuperuser
user:輸入:admin
email:不寫也行
password:輸入:admin123
驗證password:輸入:admin123
 讓你確認:輸入:y
    

注:自動重新加載 runserver,根據需要開發服務器自動重新加載Python代碼為每個請求。您不需要重新啟動服務器代碼更改生效。然而,像添加文件某些操作不觸發重新啟動,所以你必須重新啟動在這些情況下的服務器。

基本目錄結構及作用:
mysite/ # 項目的容器,名字隨便起
manage.py # 命令行實用工具,以各種方式與該Django項目進行交互
mysite/ # 實際的Python項目
init.py # 空文件,導入不出錯
settings.py # 這個Django項目配置
urls.py # 這個Django項目的URL聲明; 一個Django驅動網站的“目錄”
wsgi.py # 一個入口點為WSGI兼容的Web服務器,以滿足您的項目

Django自帶數據庫,我們也可以選擇不更改,項目開發中一般會更改使用的數據庫,更改數據庫配置在settings.py文件里

由於Django內部連接MySQL時使用的是MySQLdb模塊

目前可以使用mysql來代替pymysql了

我們需要去下載mysql
pip install mysql

在settings中修改DATABASES

DATABASES = {
    'default'{
        'ENGINE':'django.db.backends.mysql',
        'NAME':'你的數據庫名稱',
        'USER':'你的用戶名',
        'PASSWORD':'你的密碼',
        'HOST':'127.0.0.1',
        'PORT':'3306',
    }           
}

模板

也在settings里修改,主要放html文件

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

靜態文件

也在settings里修改,放css,js等文件

STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static'),
)

路由系統

路由系統就像我們我們的書本的目錄,書本的目錄會告訴你那一頁是什麼,你翻到那一頁就能看到相關的文字,路由系統就是,你對這個路由系統里的一個url地址發起了請求,路由系統會到對應的views函數去進行相關的處理,即這個url要用某個指定的views函數去處理。

來看下示例,django是怎麼規定構造路由的

from app01 import views
urlpatterns = [
    path(r'^login$',views.LoginView),
    path(r'^register$',views.RegisterView),
]
from app1 import views
urlpatterns = [
url(r'^manage1/(\d)', views.manage1),
url(r'^manage2/(?P\w)/(?P\d)', views.manage2),
url(r'^manage3/(?P\w)', views.manage3,{'id':333}),]

注意:

url多傳一個參數,那views對應的函數就要多接收一個參數

要不然會報錯的

二級路由

如果映射url太多了,全寫在一個urls.py文件里顯得繁瑣,所以出現了二級路由

就是項目的urls.py文件負責接收客戶發過來請求它判斷你傳來的東西有沒有它下面應用里的urls.py文件里有沒有,如果有就告訴應用的的urls來接收,讓它去處理,沒有就給你報錯

一級路由寫法

項目的urls.py文件里

from django.urls import path, include
urlpatterns = [
    path(r'app01/',include('app1.urls'))
]

Django是如何處理一個請求的

當用戶請求從您的 Django 的網站頁面,這是該系統遵循以確定哪些 Python 代碼執行的算法:

Django 請求是 URL 配置模塊配置。通常通過值 ROOT_URLCONF 設置,但如果傳入 HttpRequest 對象具有 urlconf 屬性(由中間件設置),它的值將代替的可以使用 ROOT_URLCONF 的設置。
Django 的負載是 Python 模塊並尋找變量 urlpatterns。這是一個 django.conf.urls.url() 實例。
Django 的貫穿每個 URL 模式,從而,在所請求的 URL 匹配的第一個停止。
一旦某個正則表達式相匹配,就運行相對應的視圖函數(或基於類的視圖)。該視圖被傳遞以下參數:
HttpRequest 對象。
如果匹配的正則表達式沒有返回命名組,然後從正則表達式比賽是作為位置參數。
關鍵詞參數是由由正則表達式匹配的任何命名組,由指定的可選參數的任何覆蓋的 kwargs參數 django.conf.urls.url()。
如果沒有正則表達式匹配,或者如果一個異常在這個過程中的任何一點時提出,Django的調用適當的錯誤處理視圖。

官方示例

from django.conf.urls import url

from . import views

urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),]

注意事項:

要捕獲從URL中的值,用 括號括起來,會當參數傳入views視圖

沒有必要添加一個斜體,因為每個URL都有。例如,它^articles不是^/articles.

在‘r’前面的每一個正則表達式是可選的,建議,它告訴python字符串是原始的,沒有字符要轉義

舉例請求:

請求/articles/2005/03/將匹配列表中的第三項,Django將調用該函數。

views.month_archive(request,‘2005’,‘03’)

/articles/2005/3/ 不會匹配任何 URL 模式,因為在列表中的第三項中需要兩位数字的月份。

/articles/2003/ 將匹配的列表,而不是第二個第一圖案,因為該圖案,以便測試,第一個是在第一測

試通過。隨意利用順序插入特殊情況是這樣的。在這裏,Django的將調用該函數

views.special_case_2003(request)

/articles/2003 不匹配任何這些模式,因為每個模式要求 URL 以斜線結束。

/articles/2003/03/03/ 將匹配的最終格局。Django 的將調用該函數。

views.article_detail(request,’2003′, ’03’, ’03’)

命名組

上面的例子使用了簡單的,非命名的正則表達式組(通過括號)來捕獲URL的位,並通過他們的位置參數的視圖,在更高級的用法,它可以使用命名正則表達式組成來捕獲URL位,將它們作為關鍵字參數傳遞給視圖。

例子:

from django.conf.urls import url
from .import views
urlpatterns = [
    url(r'^articles/2003/$',views.special_case_2003),
    url(r'^articles/(?P[0-9]{4})/$',views.year_archive),
    url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$', views.month_archive),
    url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$',views.article_detail),
]

這正好完成同樣的事情,前面的例子,一個細微的差別:捕獲的值傳遞給查看功能作為關鍵字參數,而不是位置參數。例如:

請求/articles/2005/03/會調用函數來代替,views.month_archive(request, year=’2005′,month=’03’)views.month_archive(request, ‘2005’, ’03’)
請求/articles/2003/03/03/會調用該函數,views.article_detail(request, year=’2003′,month=’03’, day=’03’)
在實踐中,這意味着你的 URLconf 稍微更明確,不容易參數順序錯誤 – 你可以在你的意見’函數定義重新排序的參數。當然,這些優點來在簡短的費用; 一些開發任務命名組的語法醜陋,太冗長。

匹配/分組算法
這裏的URL配置解析器遵循算法,相對於正則表達式命名組與非命名組:

如果有任何命名參數,它會使用這些,而忽略非命名參數。
否則,它會通過所有非命名參數作為位置參數。
在這兩種情況下,被賦予按任何額外的關鍵字參數傳遞額外的選項來查看功能也將被傳遞給視圖請求/articles/2005/03/會調用函數來代替,views.month_archive(request,year=‘2005’,month=‘03’)

3> What the URLconf searches against
The URLconf searches against the requested URL, as a normal Python string. This does not include GET or POST parameters, or the domain name.

For example, in a request to https://www.example.com/myapp/, the URLconf will look for myapp/.

In a request to https://www.example.com/myapp/?page=3, the URLconf will look for myapp/.

該URL配置不看請求方法。換言之,所有的請求的方法,GET,POST 等將被路由到為相同的URL,相同的功能。

4> 捕獲的參數總是字符串
每個捕獲的參數發送到視圖作為普通的 Python 字符串,無論什麼樣的匹配正則表達式匹配。

例如,在該URL配置行:

url(r’^articles/(?P[0-9]{4})/$’, views.year_archive),
…的 year參數傳遞給 views.year_archive()將是一個字符串,

不是一個整數,即使 [0-9]{4} 將只匹配整数字符串。

5> 指定view的默認設置
一個方便的技巧是你的觀點的論據指定默認參數。下面是一個例子的 RLconf 和看法:

urlconf

from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^blogs/$',views.page),
    url(r'blog/page(?P[0-9]+)/$',views.page),
]

views.py

def page(request,num='1'):
    '''
    處理語句塊
    '''

視圖層

對邏輯負責處理用戶的請求並返回相應,返回可以是HTML內容的網頁,或者重定向,或者錯誤,或者字典

每個應用都有views.py文件

返回快捷鍵功能

render()
render(request,template_name,context=None,content_type=None,status=None,using=None)[source]

結合給定的模板與一個給定的上下文,返回一個字典HttpRespone在渲染文本對象

所需的參數

template_name 一個模板的使用或模板序列名稱全稱。如果序列是給定的,存在於第一個模板將被使用。

可選參數

context 一組字典的值添加到模板中,默認情況下這是一個孔子點

content_type MIME類型用於生成文檔

status 為響應狀態代碼,默認值為200

using這個名字一個模板引擎將使用的模板

例子:

from django.shortcuts import render
def my_view(request):
    return render(request,'myapp/index.html',{'fpp','bar',},content_type='application/xhyml+xml')

重定向

redirect()

redirect(to,permanent=False,*args,**kwargs)[source]
默認情況下,為臨時重定向,通過permanent=True設置永久重定向

例子:

def my_view(request):
    ...
    return redirect('/some/url/')
def my_view(request):
    ...
obj = MyModel.opbjects.get(...)
return redirect(object,permanent=True)

請求和響應對象

django使用請求和響應對象在系統間傳遞狀態

當請求一個頁面時,django創建一個HttpRequest對象包含原數據的請求,然後django加載適當的視圖,通過HttpRequest作為視圖函數的第一個參數,每個視圖負責返回一個HttpResponse目標

HttpRequest對象

HttpRequest.scheme

一個字符串表示請求的計劃方案(HTTP或者HTTPS)

通常HttpRequest.path

一個字符串的完整路徑的請求

HTTPRequest.method

請求HTTP的方法,這裏保證要大寫

#偽代碼
if request.method == 'GET':
    '''
    執行業務代碼
    返回結果
    '''
    return HttpResponse('結果')
#業務邏輯:如果請求來的是GET,你返回個GET字符串
#真代碼
class GETView(objects):
    def getview(self,request):
        if request.method == 'GET':
            return HttpResponse('GET')
  
if request.method == 'GET':
    return HttpResponse('GET')
elif request.method == 'POST':
    return HttpResponse('POST')
elif request.method == 'PUT':
    return HttpResponse('PUT')
elif request.method == 'DELETE':
    return HttpResponse('DELETE')
else:
    return HttpResponse('來了老弟!')

字典包含所有給定的HTTP GET 參數對象

HttpRequest.GET

字典包含所有給定的HTTP POST 參數對象,提供請求包含表單數據

HttpRequest.POST

一個標準的python字典,包含所有的COOKIES,KEY和VALUES都是字符串

字典包含所有上傳的文件

HttpRequest.FILES

語法:

HttpRequest.FILES
filename #上傳的文件名
content_type #上傳文件的類型
content #上傳文件的內容

HttpRequest.META

一個標準的Python字典包含所有可用的HTTP頭,可用標題取決於客戶端和服務器。以下是例子

CONTENT_LENGTH 請求體的長度(一個字符串
CONTENT_TYPE 請求體的類型
HTTP_ACCEPT 為響應–可以接受的內容類型
HTTP_ACCEPT_ENCODING 接受編碼的響應
HTTP_ACCEPT_LANGUAGE 接受語言的反應
HTTP_HOST 客戶端發送的HTTP主機頭
HTTP_REFERER 參考頁面
HTTP_USER_AGENT 客戶端的用戶代理字符串
QUERY_STRING 查詢字符串,作為一個單一的(分析的)字符串
REMOTE_ADDR 客戶端的IP地址
REMOTE_HOST 客戶端的主機名
REMOTE_USER 用戶通過Web服務器的身份驗證
REQUEST_METHOD 字符串,如”GET”或”POST”
SERVER_NAME 服務器的主機名
SERVER_PORT 服務器的端口(一個字符串)

HttpResponse對象

對於HttpRequest 對象來說,是由django自動創建的,但是,HttpResponse 對象就必須我們自己創建。每個 view 請求處理方法必須返回一個 HttpResponse 對象。

HttpResponse 類在 django.http.HttpResponse

字符串使用:
典型的用法是通過頁面的內容,為一個字符串

for django.http import HttpResponse
response = HttpResponse("hello world")
response = HttpResponse("hello world",content_type="text/plain")

如果你想添加內容的增量

response = HttpResponse()
response.write("hello world")
response.write("你好")
#特性與方法:
HttpResponse.content
一個bytestring代表內容HttpResponse.charset

一個字符串的字符集表示的響應將編碼

HttpResponse.status_code

HTTP狀態代碼為響應碼

HttpResponse.streaming

這個屬性永遠為假,一般用於中間件

HttpResponse.closed

方法:

先寫的代碼,后寫的註釋

HttpResponse.__init__(content='',content_type=None,status=200,reason=None,charset=None)[source]
#實例化類自動執行的方法
HttpResponse.__setitem__(header,value)
#為給定值給定的標題名稱,都是字符串
HttpResponse.__delitem__(header)
#刪除標題的名稱,不區分大小寫
HttpResponse.__getitem__(header)
#獲取給定標題名稱。不區分大小寫。
HttpResponse.has_header(header)

#檢查是否具有給定名稱的一個標題
HttpResponse.setdefault(header, value)

#設置一個標題,除非它已經設置。
HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)

#設置一個cookie。參數跟標準庫的Cookie對象差不多
HttpResponse.set_signed_cookie(key, value, salt='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=True)

#加密cookice,可以用 HttpRequest.get_signed_cookie() 獲取,當然你也可以加鹽
HttpResponse.delete_cookie(key, path='/', domain=None)

#刪除Cookie與給定鍵。

#HttpResponse子類:
class HttpResponseRedirect[source]

構造函數的第一個參數是必需的路徑redirectto,這是一個完全合格的URL,一個合格的URL(https://www.baidu.com/搜索/),沒有一個絕對的路徑(例如:域搜索//),甚至是相對路徑(如‘/’),

optionalconstructor參數。請注意,這將返回一個HTTP狀態代碼302。
class HttpResponsePermanentRedirect[source]

像httpresponseredirect,但它返回一個永久重定向(HTTP狀態代碼301)而不是“發現”的重定向(狀態代碼302)
class HttpResponseNotModified[source]

構造函數不帶任何參數和NO含量應該被添加到這一反應。使用指定一個頁面沒有被modifiedsince用戶的最後一個請求(狀態代碼304)。
class HttpResponseBadRequest[source]

就像HttpResponse但使用400狀態碼
class HttpResponseNotFound[source]

就像HttpResponse但使用404狀態碼
class HttpResponseForbidden[source]

就像HttpResponse但使用403狀態碼
class HttpResponseNotAllowed[source]

像HttpResponse,但使用405狀態碼。第一argumentto構造函數要求准許清單的方法(如(get,后])
class HttpResponseGone[source]

就像HttpResponse但使用410狀態碼
class HttpResponseServerError[source]

就像HttpResponse但使用500狀態碼

模板層

作為一個Web框架,Django需要模板,模板包含所需的HTML輸出靜態部分以及動態內容插入。
模板的執行
from datetime import datetime
def current_datetime(request):
    now = datetime.datetime.now()
    html = "it is now %s" % now
    return HttpResponse(html)

from django import template
t = template.Templatge("my name is {{name}}")
c = template.Context({"name":"老王"})
print(t.render(c))


import datetime
from django import template
import DjangoDemo.settings
now = datetime.datetime.now()
fp = open(settings.BASE_DIR+"/templates/home/index.html")
t = template.Template(fp.read())
fp.close()
html = t.render(template.Context({'current_date':now}))
return HttpResponse(html)

from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime
def current_datetime(request):
    now = datetime.datetime.now()
    t = get_template('current_datetime.html')
    html = t.render(Content({'current_date':now}))
    return HttpResponse(html)
reurn render_to_response("Account/login.html",data,context_instance=RequestContext(request))

模板語言

模板中也有自己的語言,該語言實現數據展示
{{item}}
{% for item in item_list %}
    {{item}}
{% endfor %}
forloop.counter
forloop.first
forloop.last
{% if ordered_warranty %}
    {% else %}
{% endif %}
母板:{% block title %}{% endblock %}
子板: {% extends"base.html" %}
幫助方法:
{{ item.event_start|date:"Y-m-d H:i:s"}}
{{ bio|truncatewords:"30" }}
{{ my_list|first|upper }}
{{ name|lower }}

自定義simple_tag

在app中創建templatetags模塊

創建任意名字的.py文件

!/usr/bin/env python
coding:utf-8

from django import template
from django.utils.safestring import makesafe
from django.template.base import resolve_variable,Node,TemplateSyntaxError
register = template.Libary()
@register.simple_tag
def my_simple_time(a1,a2,a3):
    return a1+a2+a3
@register.simple_tag
def my_input(id,arg):
    result = "    "%(id,arg)
    return mark_safe(result)

在使用自定義simple_tag的html文件中導入之前創建任意名字的.py文件

{% load xx %}
//使用simple_tag
{% my_simple_time 123 %}

在settings中配置當前app,不然django無法找到自定義的simple_tag

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

Models層

Django提供了一個抽象層(Model)的構建和管理Web應用程序的數據

每個模型是一個python類,子類 django.db.models.model

模型中的每個屬性代表數據庫中的一個字段。

例子:

from django.db import models
class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

參數與字段

models.AutoField
#自增=int(11),如果沒有的化,默認會生成一個名稱為id的列,如果要显示的自定義的一個自增列,必須將給列設置為主鍵,主鍵設置方式:primary_key=True
models.CharField
#字符串字符段,必須有max_length參數
models.BooleanField
#布爾類型=tinyint(1),不能為空,Blank=True
models.ComaSeparatedlntegerField
#用逗號分隔的数字=varchar,繼承CharField,所以必須max_length參數
models.DateField
#日期類型 date,對於參數,auto_now=True則每次更新都會更新這個事件,auto_now_add則只是第一次創建添加,之後的更新不再改變
models.DateTimeField
#日期類型 datetime 同DateField參數一樣
models.Decimal
#十進制小數類型=decimal,必須制定整數位max_digits和小數位decimal_places
models.EmailField
#字符串類型(正則表達式郵箱)=varchar,對字符串進行正則表達式
models.FloatField
#浮點類型=double
models.IntegerField
#整型
models.BigIntegerField
#長整型
integer_field_ranges = {
    'SmallIntegerField': (-32768, 32767),
    'IntegerField': (-2147483648, 2147483647),
    'BigIntegerField': (-9223372036854775808, 9223372036854775807),
    'PositiveSmallIntegerField': (0, 32767),
    'PositiveIntegerField': (0, 2147483647),
  }
models.IPAddressField
#字符串類型(ipv4正則表達式)
models.GenericIPAddressField
#字符串類型(ipv4和ivp6是可選的),參數protocol可以是:both、ipv、ipv6,驗證時,會根據設置報錯
models.NullBooleanField
#允許為空的布爾類型
models.PositivenlntegerField
#正integer
models.PositiveSmallIntegerField
#正smallinteger
models.SlugField
#減號、下劃線、字母、数字
models.SmallInterField
#数字,數據庫中的字段有:tinyint、smallint、int、bigint
models.TextField
#字符串=longtext
models.TimeField
#時間 HH:MM[:ss[.uuuuuuu]]
models.URLField
#字符串,地址正則表達式
models.BinaryField
#二進制
models.ImageField
#圖片
models.FilePathField
#文件
null=True
#數據庫中字段是否可以為空
blank=True
#django的Admin中添加數據是是否允許空值
primary_key=False
#主鍵,對AutoField設置主鍵后,就會代替原來的自增id列
auto_now
#自動創建,無論添加或修改,都是當前操作的時間
auto_now_add
#自動創建愛你,永遠是創建時的時間
choices
#choices例子
GENDER_CHOICE = (
(u'M',u'Male'),
(u'F',u'Female'),
)
gender = models.CharField(max_length=2,choices=GENDER_CHOICE)
max_length
default
#默認值
verbose_name
#Admin中字段的显示名稱
nameidb_column
#數據庫中的字段名稱
unique=True
#不允許重複
db_index=True
#數據庫索引
editable=True
#在Admin里是否可編輯
error_messages=None
#錯誤提示
auto_created=False
#自動創建

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※試算大陸海運運費!

抽象工廠–設計模式

前面工廠方法模式中考慮的是一類產品的生產, 如畜牧場只管動物、電視機廠只產電視機等.

同種類稱為同等級, 也就是說,工廠方法模式只會考慮生產同等級的產品,但是在現實生活中許多工廠都是綜合性很強的,也會加大工廠的最大使用效率,能夠生產出多等級的產品. 畜牧場可以養動物,也可以養植物等.

本篇博客將講述抽象工廠方法模式.抽象工廠模式將考慮多等級的產品同時生產,將處於同一個具體工廠所生產的不同等級的產品作為一個產品族. 

模式的定義與特點

定義

是一種為訪問類創建一組相關或者相互依賴的接口,並且訪問類不需要制定所要的產品的具體類就可以得到同族不同等級的產品模式結構.

抽象工廠模式一般都是工廠模式的升級, 工廠模式只生產一個等級的產品,而抽象工廠模式可生產多個等級的產品.

特點

使用抽象工廠模式一般要滿足如下條件.

  • 系統中有許多個產品族,每個具體工廠創建統一族但又屬於不同等級結構的產品.

抽象工廠有工廠模式的優點之外,還主要有以下優點:

  • 可在類的內部對產品族中相關聯的等級產品進行共同管理,並且不需要引入多個類來進行管理.
  • 當增加一個產品族時,不需要更改原來的代碼,滿足了開閉原則.

抽象工廠缺點:

  • 當產品族中需要增加新的產品時,所有的工廠類都需要更改

 

模式的結構和實現

抽象工廠和工廠方法一樣,都是由抽象工廠、具體工廠、抽象產品和具體產品4個要素組成,但是抽象工廠中方法個數有所不同,抽象的產品也會有不同.

結構:

模式的主要角色如下:

  1. 抽象工廠: 提供了創建產品的接口,包含了多個創建產品的方法,也可以創建多個不同等級的產品.
  2. 具體工廠: 實現抽象工廠的多個抽象方法, 完成具體產品的創建.
  3. 抽象產品: 定義了產品規範, 描述產品的主要特性和功能, 抽象工廠模式有多個的抽象產品.
  4. 具體產品: 實現了抽象產品定義的接口, 具體工廠來創建, 同具體工廠的關係是多對一.

結構圖如下:

模式的實現

上面的圖可發現,抽象工廠和工廠方法有些類似,不同的是產品種類不止一個, 所以創建產品方法也不止一個.

抽象工廠: 提供了產品的生產方法

interface AbstractFactory
{
    public Product1 newProduct1();
    public Product2 newProduct2();
}

具體工廠: 實現產品的生產

class ConcreteFactory1 implements AbstractFactory
{
    public Product1 newProduct1()
    {
        System.out.println("具體工廠 1 生成-->具體產品 11...");
        return new ConcreteProduct11();
    }
    public Product2 newProduct2()
    {
        System.out.println("具體工廠 1 生成-->具體產品 21...");
        return new ConcreteProduct21();
    }
}

 

模式應用實例 

[例1] 抽象工廠設計牧場類.

分析: 農場除了畜牧業可以養動物,也可以養植物,並且也可以種其他的.

抽象工廠模式設計兩個牧場, 一個農場用於養牛和種菜 ,一個用於養馬和種水果.

可以在兩個農場定義生成動物的方法和培養植物的算法.

設計如下結構圖:

代碼如下:

//抽象產品:動物類
interface Animal
{
    public void show();
}

//具體產品:馬類
class Horse implements Animal
{

    public void show()
    {
        jf.setVisible(true);
    }
}

//具體產品:牛類
class Cattle implements Animal
{
   
    public void show()
    {
        jf.setVisible(true);
    }
}

//抽象產品:植物類
interface Plant
{
    public void show();
}
//具體產品:水果類
class Fruitage implements Plant
{    
    public void show()
    {
        jf.setVisible(true);
    }
}
//具體產品:蔬菜類
class Vegetables implements Plant
{
    public void show()
    {
        jf.setVisible(true);
    }
}
//抽象工廠:農場類
interface Farm
{
    public Animal newAnimal();
    public Plant newPlant();
}
//具體工廠:農場類1
class SGfarm implements Farm
{
    public Animal newAnimal()
    {
        System.out.println("新牛出生!");
        return new Cattle();
    }
    public Plant newPlant()
    {
        System.out.println("蔬菜長成!");
        return new Vegetables();
    }
}
//具體工廠:農場類2
class SRfarm implements Farm
{
    public Animal newAnimal()
    {
        System.out.println("新馬出生!");
        return new Horse();
    }
    public Plant newPlant()
    {
        System.out.println("水果長成!");
        return new Fruitage();
    }
}

 

模式的應用場景

抽象工廠模式一般適用於如下場景:

  1. 當需要創建的對象是一系列的相互關聯或者依賴的產品族時. 例如工廠中的電視機,收音機以及空調等
  2. 系統有多個產品族, 但每次只使用其中的某一族產品時. 如有人只希望某種品牌的衣服和鞋子
  3. 系統提供了產品的類庫, 所有產品的接口都相同. 

模式的拓展:

  1. 當增加了一個新的產品族時只需要增加一個新的具體實現工廠,不需要更改原來的代碼,滿足了開閉原則
  2. 當產品族需要增加一個新種類的產品時, 所有的工廠類都需要更改,不符合開閉原則
  3. 當只存在了一個等級結構的產品時,也就退化到了工廠模式的結構.

 

以上就是抽象工廠的理論和實踐模式的內容,希望對大家有所幫助!!!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

iOS:應用程序擴展開發之Today擴展(Today Extesnsion)

一、簡介

iOS應用程序擴展是蘋果在iOS8推出的一個新特性,可以將自定義的功能和內容擴展到應用程序之外,在之後又經過不斷地優化和更新,已經成為開發中不可或缺的功能之一。擴展也是一個Target項目,它運行在主機應用程序上,可以與主機應用程序實現資源共享,和宿主應用程序的Target項目是彼此獨立的。系統提供的擴展有很多,Toady擴展就是其中之一,也被成為應用程序插件,它的作用是將今日發生的簡單消息展示在系統的插件界面上。Toady擴展模板名稱為Today Extension。圖1是創建Today擴展,圖2是擴展显示在插件界面上(可以通過點擊Edit來添加或者移除擴展)。 

 

二、創建

按照上圖1的方式創建一個Today Extension的Target后,系統會默認幫我們生成一個TodayViewController控制器類、MainInterface.storyBoard故事板、plist序列化文件,文件結構圖如下:

上圖中紅色圈內和箭頭指向的配置就是系統通過MainInterface.storyBoard幫我們實現了一個基本的Toady插件UI布局,運行后可以直接显示在插件界面上。可是,有的時候開發者並不想使用系統的故事板來構建UI,系統支持自定義的,我們只需要修改plist配置即可。具體的配置是這樣的:

[1] 將NSExtensionMainStoryboard字段刪除;

[2] 添加NSExtensionPrincipalClass字段,修改value為控制器的類名。 

[3] 在TodayViewController中的ViewDidLoad中設置preferredContentSize屬性大小,用來調整widget界面UI的尺寸。

配置如下圖所示:

//設置尺寸
self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 300); 

  

三、分析

TodayViewController類比較簡單,就是一個VC類,它實現了系統提供的一個擴展協議<NCWidgetProviding>,可以在協議方法中實現對擴展的更新和狀態監控。

協議如下,都是可選的,開發者根據需要進行重寫。

//協議
@protocol NCWidgetProviding <NSObject>

@optional

//當數據更新時調用的方法,系統會定期更新擴展
- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult result))completionHandler;

//監聽显示模式(寬鬆型、緊奏型)和尺寸的改變,其中寬鬆和緊湊表示的是展開和摺疊狀態, iOS10開始才能使用
- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize __API_AVAILABLE(ios(10.0));

//設置擴展UI邊距,注意:使用StoryBoard時,若要所見即所得,則這個方法中需要返回UIEdgeInsetsZero; (iOS10 and later 不會再被調用,棄用了)
- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets __API_DEPRECATED("This method will not be called on widgets linked against iOS versions 10.0 and later.", ios(8.0, 10.0));

@end
//擴展,都是iOS10開始才能使用
@interface NSExtensionContext (NCWidgetAdditions)

//設置widget摺疊或展開狀態
@property (nonatomic, assign) NCWidgetDisplayMode widgetLargestAvailableDisplayMode __API_AVAILABLE(ios(10.0));

//只讀,widget狀態
@property (nonatomic, assign, readonly) NCWidgetDisplayMode widgetActiveDisplayMode __API_AVAILABLE(ios(10.0));

//獲取widget不同狀態的尺寸
- (CGSize)widgetMaximumSizeForDisplayMode:(NCWidgetDisplayMode)displayMode __API_AVAILABLE(ios(10.0));

@end

 

四、交互

Today擴展是寄宿於主機應用程序上的, TodayViewController又是一個UIViewController類,系統支持Today擴展對UIViewController進行切換。也就是說,蘋果在考慮提供給開發者在對UIViewController中添加各種展示控件這種便利的同時,也相應的提供給開發者通過Today擴展的widget從主機應用程序激活並打開宿主應用程序的機會。不過這個操作必須通過設置並調起scheme來實現。步驟如下:

[1] 配置宿主應用程序的scheme;

[2] 使用擴展的openURL打開宿主應用程序。

交互如下:

//擴展通過scheme打開主宿主應用程序
[self.extensionContext openURL:[NSURL URLWithString:@"MainApp://"] completionHandler:nil];

 

五、數據

既然Today擴展能與宿主應用程序進行交互,那麼肯定就存在數據通信的問題了。擴展與宿主目錄應用程序位於不同的目錄結構中,默認情況下,擴展與宿主應用程序的數據並不共享,代碼也不能復用。例如在宿主目錄應用程序中可能有網絡請求、數據持久化存儲等結構框架,在擴展中不可以直接使用,擴展需要提供自己的網絡請求框架、數據持久化框架等。這些問題蘋果都提供了解決方法,可以通過創建靜態庫的方式實現代碼共享,通過APP Group和Scheme跳轉實現數據共享。這裏主要講一下數據共享。注意:擴展和宿主應用程序的素材文件也是互相獨立的,必須將擴展中的素材添加到擴展Target。

方式一:通過配置scheme跳轉來實現數據共享。可以將傳遞的數據配置到URL中,然後宿主應用程序通過AppDeleagte的代理方法application:openURL:options:獲取數據,不過這個數據傳遞只能是單方向的。

 //打開主應用程序
-(void)openMainApp {
    
//共享數據
    NSString *schemeFormat = @"MainApp://action=openCarema?name=xiayuanquan";
    [self.extensionContext openURL:[NSURL URLWithString:schemeFormat] completionHandler:nil];
}
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    
    //從URL獲取共享數據,截取數據
    NSLog(@"---------url = %@---------",url);
    
    return YES;
}

方式二:給擴展的Target和宿主應用程序的Target項目都開啟APP Group,兩者配置相同的appgroupIndentifier標識,分別生成後綴名為.entitlements文件。然後對於小數據推薦使用偏好進行雙向傳遞共享數據,如圖所示。

//共享數據
//使用偏好設置
NSUserDefaults *defalut = [[NSUserDefaults alloc] initWithSuiteName:@"group.xiayuanquan"];
[defalut setObject:@"xiayuanquan" forKey:@"name"];
//從偏好設置獲取共享數據
NSUserDefaults *defalut = [[NSUserDefaults alloc] initWithSuiteName:@"group.xiayuanquan"];
NSString *name1 = [defalut objectForKey:@"name"];
NSLog(@"1------------name1=%@",name1);

方式三:配置跟方式二一樣,不過雙向傳遞共享數據使用文件目錄來實現。

//共享數據
//方式二:使用共享目錄
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *baseURL = [fileManager containerURLForSecurityApplicationGroupIdentifier:@"group.xiayuanquan"];
NSURL *filePath = [baseURL URLByAppendingPathComponent:@"file"];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:@"xiayuanquan" requiringSecureCoding:NO error:nil];
[data writeToURL:filePath atomically:YES];
//從共享目錄獲取共享數據
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *baseURL = [fileManager containerURLForSecurityApplicationGroupIdentifier:@"group.xiayuanquan"];
NSURL *filePath = [baseURL URLByAppendingPathComponent:@"file"];
NSData *data = [NSData dataWithContentsOfURL:filePath];
NSLog(@"2------------data=%@",data);

 

六、適配

從iOS10開始,蘋果提供了NCWidgetDisplayMode展示模式,通過設置該模式來支持對widget進行摺疊和展開。在這裏,preferredContentSize就用到了。這個是用來設置widget的尺寸的。蘋果對widget的尺寸有自己的標準,width為maxSize.width,height取值範圍[110, maxSize.height]。這個maxSize可以在擴展協議<NCWidgetProviding>的協議方法也即widgetActiveDisplayModeDidChange:withMaximumSize中獲取:,可以發現每一種機型maxSize不一樣。

// 6s模擬器下:
// NCWidgetDisplayModeCompact模式下:{359.000000, 110.000000}
// NCWidgetDisplayModeExpanded模式下:{359.000000, 528.000000}

// 8 plus模擬器下:
// NCWidgetDisplayModeCompact模式下:{304.000000, 110.000000}
// NCWidgetDisplayModeExpanded模式下:{304.000000, 616.000000}

摺疊狀態:widget的高為110,此時設置preferredContentSize無效; 

展開狀態:widget的高為開發者設置的preferredContentSize.height,但是如果preferredContentSize.height>maxSize.height,此時取值為maxSize.height。 

適配iOS10,默認支持展開,設置如下: 

//設置widget默認為可以展開,此時處於摺疊狀態
#ifdef __IPHONE_10_0 //適配iOS10
   self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
#endif

 

七、範例

【去掉MainInterface.storyBoard,採用純代碼實現】

1、宿主應用程序AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    //存儲共享數據
    //方式二:使用偏好設置
    NSUserDefaults *defalut = [[NSUserDefaults alloc] initWithSuiteName:@"group.xiayuanquan"];
    [defalut setObject:@"xiayuanquan" forKey:@"name"];
    
    //存儲共享數據
    //方式三:使用共享目錄
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSURL *baseURL = [fileManager containerURLForSecurityApplicationGroupIdentifier:@"group.xiayuanquan"];
    NSURL *filePath = [baseURL URLByAppendingPathComponent:@"file"];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:@"xiayuanquan" requiringSecureCoding:NO error:nil];
    [data writeToURL:filePath atomically:YES];
    
    return YES;
}

-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    
    //方式一:從URL獲取共享數據,例如參數
    NSLog(@"---------url = %@---------",url);
    
    return YES;
    
}

2、Widget擴展TodayViewController

//
//  TodayViewController.m
//  TodayExtension
//  Created by 夏遠全 on 2019/11/19.
//

#import "TodayViewController.h"
#import <NotificationCenter/NotificationCenter.h>

@interface TodayViewController () <NCWidgetProviding>

@end

@implementation TodayViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self config];
    [self createUI];
    [self fecthData];
}

//配置
-(void)config {
    
    self.view.backgroundColor = [UIColor lightGrayColor]; //widget背景色為灰色
    self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 300); //widget尺寸大小, 寬度實際取maxSize,width,高度[110, maxSize.height]
    
    //設置widget默認為可以展開,此時處於摺疊狀態
    #ifdef __IPHONE_10_0 //適配iOS10
        self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
    #endif
    
}

//創建UI
-(void)createUI {
    
    CGFloat width = self.view.frame.size.width;
    CGFloat btnWidth = 100;
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake((width-btnWidth)/2, 0, btnWidth, 40)];
    button.backgroundColor = [UIColor greenColor];
    [button setTitle:@"OpenAPP" forState:UIControlStateNormal];
    [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(openMainApp) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}

//打開主應用程序
-(void)openMainApp {
    
    //傳遞共享數據
    //方式一:參數傳遞
    NSString *schemeFormat = @"MainApp://action=openCarema?name=xiayuanquan";
    [self.extensionContext openURL:[NSURL URLWithString:schemeFormat] completionHandler:nil];
    
}

//獲取共享數據
-(void)fecthData {
    
    //方式二:從偏好設置獲取共享數據
    NSUserDefaults *defalut = [[NSUserDefaults alloc] initWithSuiteName:@"group.xiayuanquan"];
    NSString *name1 = [defalut objectForKey:@"name"];
    NSLog(@"1------------name1=%@",name1);
    
    //方式三:從共享目錄獲取共享數據
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSURL *baseURL = [fileManager containerURLForSecurityApplicationGroupIdentifier:@"group.xiayuanquan"];
    NSURL *filePath = [baseURL URLByAppendingPathComponent:@"file"];
    NSData *data = [NSData dataWithContentsOfURL:filePath];
    NSLog(@"2------------data=%@",data);
}

//當數據更新時調用的方法,系統會定期更新擴展
- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
    
    //獲取共享的數據,根據判斷回調對應的block
    //NCUpdateResultNewData,
    //NCUpdateResultNoData,
    //NCUpdateResultFailed
    
    completionHandler(NCUpdateResultNoData);
}


//監聽显示模式(寬鬆型、緊奏型)和尺寸的改變
//NCWidgetDisplayModeCompact :  摺疊
//NCWidgetDisplayModeExpanded : 展開
- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize {
    
    //maxSize:
    //雖說是最大的Size,但蘋果還是把Widget的高度範圍限制在了[110 ~ maxSize]之間
    //如果設置高度小於110,那麼default = 110;
    //如果設置高度大於開發者設置的preferredContentSize.Heiget,那麼default = maxSize;
    //摺疊狀態下,蘋果將高度固定為110,這個時候設置preferredContentSize屬性無效。
    NSLog(@"width = %lf-------height = %lf",maxSize.width,maxSize.height);
    
    //可以更改狀態
    if (activeDisplayMode == NCWidgetDisplayModeExpanded) {
        self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 300);
    }
    else{
        self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 100);
    }
}

//設置擴展UI邊距,注意:使用StoryBoard時,若要所見即所得,則這個方法中需要返回UIEdgeInsetsZero; (iOS10 and later 不會再被調用)
//- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {
//    return UIEdgeInsetsZero;
//}

@end

3、打印和gif

2019-11-20 16:22:31.074596+0800 TodayExtension[29668:1132736] 1------------name1=xiayuanquan
2019-11-20 16:22:31.234435+0800 TodayExtension[29668:1132736] 2------------data={length = 149, bytes = 0x62706c69 73743030 d4010203 04050607 ... 00000000 00000068 }
2019-11-20 16:22:31.234970+0800 TodayExtension[29668:1132736] maxSize.width = 359.000000-------maxSize.height = 110.000000 //摺疊
2019-11-20 16:22:38.117764+0800 TodayExtension[29668:1132736] maxSize.width = 359.000000-------maxSize.height = 528.000000 //展開

 

 

 

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務