Python版——博客網站四 編寫日志創建頁

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

開源地址:https://github.com/leebingbin/Python3.WebAPP.Blog

?

????單從編碼來說,WebApp開發真正困難的地方在于編寫前端頁面。前端頁面需要混合HTML、CSS和JavaScript,如果對這三者沒有深入地掌握,編寫的前端頁面將很快難以維護。更大的問題在于,前端頁面通常是動態頁面,也就是說,前端頁面往往是由后端代碼生成的。
????生成前端頁面最早的方式是拼接字符串:

s = '<html><head><title>'+ title+ '</title></head><body>'+ body+ '</body></html>'

????顯然這種方式完全不具備可維護性。所以有第二種模板方式:

<html>
<head><title>{{ title }}</title>
</head>
<body>{{ body }}
</body>
</html>

????JSP、PHP等都是用這種模板方式生成前端頁面。如果在頁面上大量使用JavaScript(實際上大部分頁面都會),模板方式仍然會導致JavaScript代碼與后端代碼綁得非常緊密,以至于難以維護。其根本原因在于負責顯示的HTML DOM模型與負責數據和交互的JavaScript代碼沒有分割清楚。
????要編寫可維護的前端代碼絕非易事。和后端結合的MVC模式已經無法滿足復雜頁面邏輯的需要了,所以,新的MVVM:Model View ViewModel模式應運而生。
????MVVM最早由微軟提出來,它借鑒了桌面應用程序的MVC思想,在前端頁面中,把Model用純JavaScript對象表示:

<script>var blog = {name: 'hello python3',summary: 'this is summary',content: 'this is content'};
</script>

View是純HTML:

<form action="/api/blogs" method="post"><input name="name"><input name="summary"><textarea name="content"></textarea><button type="submit">Submit</button>
</form>

????由于Model表示數據,View負責顯示,兩者做到了最大限度的分離。
????把Model和View關聯起來的就是ViewModel。ViewModel負責把Model的數據同步到View顯示出來,還負責把View的修改同步回Model。
????ViewModel如何編寫?需要用JavaScript編寫一個通用的ViewModel,這樣,就可以復用整個MVVM模型了。市面上已有許多成熟的MVVM框架,例如AngularJS,KnockoutJS等。我們選擇Vue (https://vuejs.org/)這個簡單易用的MVVM框架來實現創建Blog的頁面templates/manage_blog_edit.html:

{% extends '__base__.html' %}{% block title %}編輯日志{% endblock %}{% block beforehead %}<script>varID = '{{ id }}',action = '{{ action }}';function initVM(blog) {var vm = new Vue({el: '#vm',data: blog,methods: {submit: function (event) {event.preventDefault();var $form = $('#vm').find('form');$form.postJSON(action, this.$data, function (err, r) {if (err) {$form.showFormError(err);}else {return location.assign('/api/blogs/' + r.id);}});}}});$('#vm').show();
}$(function () {if (ID) {getJSON('/api/blogs/' + ID, function (err, blog) {if (err) {return fatal(err);}$('#loading').hide();initVM(blog);});}else {$('#loading').hide();initVM({name: '',summary: '',content: ''});}
});</script>{% endblock %}{% block content %}<div class="uk-width-1-1 uk-margin-bottom"><div class="uk-panel uk-panel-box"><ul class="uk-breadcrumb"><li><a href="/manage/comments">評論</a></li><li><a href="/manage/blogs">日志</a></li><li><a href="/manage/users">用戶</a></li></ul></div></div><div id="error" class="uk-width-1-1"></div><div id="loading" class="uk-width-1-1 uk-text-center"><span><i class="uk-icon-spinner uk-icon-medium uk-icon-spin"></i> 正在加載...</span></div><div id="vm" class="uk-width-2-3"><form v-on="submit: submit" class="uk-form uk-form-stacked"><div class="uk-alert uk-alert-danger uk-hidden"></div><div class="uk-form-row"><label class="uk-form-label">標題:</label><div class="uk-form-controls"><input v-model="name" name="name" type="text" placeholder="標題" class="uk-width-1-1"></div></div><div class="uk-form-row"><label class="uk-form-label">摘要:</label><div class="uk-form-controls"><textarea v-model="summary" rows="4" name="summary" placeholder="摘要" class="uk-width-1-1" style="resize:none;"></textarea></div></div><div class="uk-form-row"><label class="uk-form-label">內容:</label><div class="uk-form-controls"><textarea v-model="content" rows="16" name="content" placeholder="內容" class="uk-width-1-1" style="resize:none;"></textarea></div></div><div class="uk-form-row"><button type="submit" class="uk-button uk-button-primary"><i class="uk-icon-save"></i> 保存</button><a href="/manage/blogs" class="uk-button"><i class="uk-icon-times"></i> 取消</a></div></form></div>{% endblock %}

????初始化Vue時,我們指定3個參數:
????????el:根據選擇器查找綁定的View,這里是#vm,就是id為vm的DOM,對應的是一個<div>標簽;
????????data:JavaScript對象表示的Model,我們初始化為{ name: '', summary: '', content: ''};
????????methods:View可以觸發的JavaScript函數,submit就是提交表單時觸發的函數。
????接下來,我們在<form>標簽中,用幾個簡單的v-model,就可以讓Vue把Model和View關聯起來:

<!-- input的value和Model的name關聯起來了 -->
<input v-model="name" class="uk-width-1-1">

????Form表單通過<form v-on="submit: submit">把提交表單的事件關聯到submit方法。
????需要特別注意的是,在MVVM中,Model和View是雙向綁定的。如果我們在Form中修改了文本框的值,可以在Model中立刻拿到新的值。試試在表單中輸入文本,然后在Chrome瀏覽器中打開JavaScript控制臺,可以通過vm.name訪問單個屬性,或者通過vm.$data訪問整個Model:

????如果我們在JavaScript邏輯中修改了Model,這個修改會立刻反映到View上。試試在JavaScript控制臺輸入vm.name = 'MVVM簡介',可以看到文本框的內容自動被同步了。

????雙向綁定是MVVM框架最大的作用。借助于MVVM,我們把復雜的顯示邏輯交給框架完成。由于后端編寫了獨立的REST API,所以,前端用AJAX提交表單非常容易,前后端分離得非常徹底。

?

?

本文為博主原創文章,轉載請注明出處!

https://my.oschina.net/u/3375733/blog/

轉載于:https://my.oschina.net/u/3375733/blog/1547263

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257352.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257352.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257352.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言0-1勻分布隨機數,C++ generate_canonical均勻分布隨機數函數用法詳解

標準均勻分布是一個在范圍 [0&#xff0c;1) 內的連續分布。generate_canonical() 函數模板會提供一個浮點值范圍在 [0&#xff0c;1) 內&#xff0c;且有給定的隨機比特數的標準均勻分布。它有 3 個模板參數&#xff1a;浮點類型、尾數的隨機比特的個數&#xff0c;以及使用的…

第三十四天 how can I 堅持

“不要把所有的雞蛋放在同一個籃子里”是錯誤的&#xff0c;投資應該像馬克吐溫說的那樣&#xff0c;要把所有的雞蛋放在同一籃子里&#xff0c;并小心的看好他。---巴菲特。 那盆花還沒死&#xff0c;但是我又能做什么呢&#xff1f;技術。永遠的技術。睡覺。轉載于:https://w…

01-Swift 介紹

簡介 Swift 語言由蘋果公司在 2014 年推出&#xff0c;用來撰寫 OS X 和 iOS 應用程序2014 年&#xff0c;在 Apple WWDC 發布 幾家歡喜,幾家愁愁者:只學Object-C的人歡喜者:之前做過java/python/js語言的人歷史 2010 年 7 月&#xff0c;蘋果開發者工具部門總監 Chris Lattner…

2017—2018 實驗報告:實驗一

實驗一&#xff1a;實驗報告 課程&#xff1a;程序設計與數據結構 班級&#xff1a; 1623 姓名&#xff1a; 張旭升 學號&#xff1a;20162329 指導教師&#xff1a;婁嘉鵬 王志強 實驗日期&#xff1a;9月25日 實驗密級&#xff1a; 非密級 預習程度&#xff1a; 已預習 必修/…

病床呼叫系統有顯示屏c語言,病床呼叫系統畢業設計

內容介紹完整版大學病床呼叫系統畢業設計&#xff0c;已修改完格式摘 要醫院已經從人工管理模式向智能化方向發展。“病床呼叫系統”可以實現對病房的智能化管理&#xff0c;可實現呼叫、求救警報、信息存儲、顯示等等功能。患者在住院期間&#xff0c;可能會在任意時間請求醫…

1. mybatis批量插入數據

通過list <insert id"saveByList" useGeneratedKeys"true" parameterType"java.util.List"> insert into T_App_Default_User(UserID,AppType,CreateTime)values <foreach collection"list" item"item" index&quo…

iOS開發 - Swift實現清除緩存功能

前言: 開發移動應用時&#xff0c;請求網絡資源是再常見不過的功能。如果每次都去請求&#xff0c;不但浪費時間&#xff0c;用戶體驗也會變差&#xff0c;所以移動應用都會做離線緩存處理&#xff0c;其中已圖片緩存最為常見。 但是時間長了&#xff0c;離線緩存會占用大量的…

c語言結構體單元測試,C語言結構體單元練習.doc

C語言結構體單元練習1.有以下定義和語句&#xff1a;struct student{ int age;int num; };struct student stu[3]{{1001,20},{1002,19},{1003,21}};main(){ struct student *p;pstu;…… }則以下不正確的引用是 。A) (p)->num B) p C) (*p).num D) p&stu.age2.有以下結構…

如何開啟IIS7以上的“IIS6管理兼容性”

護衛神PHP套件的安裝&#xff0c;需要開啟“IIS6管理兼容性”&#xff0c; 那么&#xff0c;如何開啟IIS7、IIS7.5、IIS8.0的IIS6兼容模式呢&#xff1f; 設置的時候&#xff0c;請參照如下截圖&#xff1a; 本文轉自黃聰博客園博客&#xff0c;原文鏈接&#xff1a;http://www…

pop to 特定的UIViewController

1. 我們可以推出到特定的UIViewController 2. 有一個類沒有navigationController&#xff0c;以前一般用delegate&#xff0c;我覺得我們可以把引用一個navigationController&#xff0c;然后使用它來推出另一個UIViewController轉載于:https://www.cnblogs.com/studyNT/p/4486…

藍橋杯:矩陣翻硬幣

題目地址&#xff1a;http://lx.lanqiao.org/problem.page?gpidT126 這道題強烈建議用java做&#xff0c;畢竟自帶BigInteger類。 此題看似是一道模擬題&#xff0c;但由于數據規模很大&#xff08;10的1000次方&#xff09;&#xff0c;只能找規律。規律是最終結果為sqrt(n)*…

ssh服務端口轉發詳解

端口轉發的概念和應用什么是端口轉發呢&#xff0c;我們知道&#xff0c;SSH 會自動加密和解密所有 SSH 客戶端與服務端之間的網絡數據。但是&#xff0c;SSH 還同時提供了一個非常有用的功能&#xff0c;這就是端口轉發。它能夠將其他 TCP 端口的網絡數據通過 SSH 鏈接來轉發&…

W ndoWs文件夾窗口,如何在本地網絡中訪問-Synology-NAS-上的文件-(Wndows).pdf

如何在本地網絡中訪問-Synology-NAS-上的文件-(Wndows)如何在本地網絡中訪問 Synology NAS 上的文件 (Windows)概述Synology NAS 經過專門設計&#xff0c;可快速簡單地在本地網絡中存儲和共享文件&#xff0c;讓您直接訪問 SynologyNAS 上的文件而沒有每次登錄 DSM 的麻煩。例…

左移與右移

左移 無論被移動的數是有符號還是無符號&#xff0c;左移一位相當于乘2(在不溢出的情形下) 右移 對于無符號數&#xff0c;右移一位相當于除以2&#xff1b; 對于有符號數&#xff0c;如果還想獲得同樣右移除以2的效果&#xff0c;就要考慮算數右移&#xff0c;即符號位始終不變…

Serializing Lua objects into Lua Code

The following little snippet allows you to ‘pickle’ Lua objects directly into Lua code (with the exception of functions, which are serialized as raw bytecode). Metatable support is on the way, but for now, it should be useful enough. Example code: view s…

布局管理器android,Android課程---布局管理器之相對布局(一)

下面示例的是在父容器里如何設置按鈕的位置&#xff0c;難度&#xff1a;***&#xff0c;重點是找到一個主按鈕&#xff0c;設置它的id&#xff0c;然后根據它來設置其他按鈕在父容器的位置。代碼示例&#xff1a;android:layout_width"match_parent"android:layout_…

【Cocos2d-Js基礎教學 入門目錄】

本教程視地址頻在&#xff1a;九秒課堂 完全免費從接觸Cocos2dx-Js以來&#xff0c;它的綻放的絢麗讓我無法不對它喜歡。我覺得Js在不斷帶給我們驚喜&#xff1b;在開發過程中&#xff0c;會大大提升我們對原型開發的利用率&#xff0c;使用Js語言做游戲開發&#xff0c;使游戲…

Hammer.js移動端觸屏框架的使用

hammer.js是一個多點觸摸手勢庫&#xff0c;能夠為網頁加入Tap、Double Tap、Swipe、Hold、Pinch、Drag等多點觸摸事件&#xff0c;免去自己監聽底層touchstart、touchmove、touchend事件并且寫一大堆判斷邏輯的痛苦。hammer.js不但支持觸摸屏設備的瀏覽器&#xff0c;在桌面瀏…

Android實現筆記本修改功能,安卓12第二個開發者預覽版推出:UI、功能有所改進...

最近谷歌正式推出了Android 12的第二個開發者預覽版&#xff0c;帶來了很多UI和功能上的改進。首先最明顯的變化應該是鎖屏界面和下拉通知欄的音樂播放器。此前這部分UI的配色一直采用的是音樂專輯的主色調&#xff0c;但在Android 12上&#xff0c;這個配色變成了系統的強調色…

Delphi編譯報錯對照表

; not allowed before ‘ELSE’ → ElSE前不允許有“;” ” clause not allowed in OLE automation section → 在OLE自動區段不允許“”子句 ” is not a type identifier → 不是類型標識符 ” not previously declared as a PROPERTY → 前面沒有說明PROPERTY ‘GOTO ‘ lea…