About Me
10 |defshine,Software Engineer
12 | 13 |Stack
14 |15 |21 |Java,Spring,Hiberante,MyBatis
20 |
16 | Python,Flask
17 | MySql,MongoDB
18 | jQuery,AngularJS
19 | Linux,Git
├── .gitignore ├── README.md ├── app ├── __init__.py ├── core │ ├── __init__.py │ ├── admin │ │ ├── __init__.py │ │ ├── forms.py │ │ └── views.py │ ├── api │ │ ├── __init__.py │ │ └── views.py │ ├── forms.py │ ├── models.py │ └── views.py ├── static │ ├── css │ │ ├── index.css │ │ └── lib │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.css.map │ │ │ ├── bootstrap.min.css │ │ │ ├── material-wfont.css │ │ │ ├── material.css │ │ │ └── ripples.css │ ├── fonts │ │ ├── Material-Design-Icons.eot │ │ ├── Material-Design-Icons.svg │ │ ├── Material-Design-Icons.ttf │ │ ├── Material-Design-Icons.woff │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ └── glyphicons-halflings-regular.woff │ └── js │ │ └── lib │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ ├── ckeditor │ │ ├── adapters │ │ │ └── jquery.js │ │ ├── ckeditor.js │ │ ├── config.js │ │ ├── contents.css │ │ ├── lang │ │ │ ├── af.js │ │ │ ├── ar.js │ │ │ ├── bg.js │ │ │ ├── bn.js │ │ │ ├── bs.js │ │ │ ├── ca.js │ │ │ ├── cs.js │ │ │ ├── cy.js │ │ │ ├── da.js │ │ │ ├── de.js │ │ │ ├── el.js │ │ │ ├── en-au.js │ │ │ ├── en-ca.js │ │ │ ├── en-gb.js │ │ │ ├── en.js │ │ │ ├── eo.js │ │ │ ├── es.js │ │ │ ├── et.js │ │ │ ├── eu.js │ │ │ ├── fa.js │ │ │ ├── fi.js │ │ │ ├── fo.js │ │ │ ├── fr-ca.js │ │ │ ├── fr.js │ │ │ ├── gl.js │ │ │ ├── gu.js │ │ │ ├── he.js │ │ │ ├── hi.js │ │ │ ├── hr.js │ │ │ ├── hu.js │ │ │ ├── id.js │ │ │ ├── is.js │ │ │ ├── it.js │ │ │ ├── ja.js │ │ │ ├── ka.js │ │ │ ├── km.js │ │ │ ├── ko.js │ │ │ ├── ku.js │ │ │ ├── lt.js │ │ │ ├── lv.js │ │ │ ├── mk.js │ │ │ ├── mn.js │ │ │ ├── ms.js │ │ │ ├── nb.js │ │ │ ├── nl.js │ │ │ ├── no.js │ │ │ ├── pl.js │ │ │ ├── pt-br.js │ │ │ ├── pt.js │ │ │ ├── ro.js │ │ │ ├── ru.js │ │ │ ├── si.js │ │ │ ├── sk.js │ │ │ ├── sl.js │ │ │ ├── sq.js │ │ │ ├── sr-latn.js │ │ │ ├── sr.js │ │ │ ├── sv.js │ │ │ ├── th.js │ │ │ ├── tr.js │ │ │ ├── tt.js │ │ │ ├── ug.js │ │ │ ├── uk.js │ │ │ ├── vi.js │ │ │ ├── zh-cn.js │ │ │ └── zh.js │ │ ├── plugins │ │ │ ├── a11yhelp │ │ │ │ └── dialogs │ │ │ │ │ ├── a11yhelp.js │ │ │ │ │ └── lang │ │ │ │ │ ├── _translationstatus.txt │ │ │ │ │ ├── af.js │ │ │ │ │ ├── ar.js │ │ │ │ │ ├── bg.js │ │ │ │ │ ├── ca.js │ │ │ │ │ ├── cs.js │ │ │ │ │ ├── cy.js │ │ │ │ │ ├── da.js │ │ │ │ │ ├── de.js │ │ │ │ │ ├── el.js │ │ │ │ │ ├── en-gb.js │ │ │ │ │ ├── en.js │ │ │ │ │ ├── eo.js │ │ │ │ │ ├── es.js │ │ │ │ │ ├── et.js │ │ │ │ │ ├── fa.js │ │ │ │ │ ├── fi.js │ │ │ │ │ ├── fr-ca.js │ │ │ │ │ ├── fr.js │ │ │ │ │ ├── gl.js │ │ │ │ │ ├── gu.js │ │ │ │ │ ├── he.js │ │ │ │ │ ├── hi.js │ │ │ │ │ ├── hr.js │ │ │ │ │ ├── hu.js │ │ │ │ │ ├── id.js │ │ │ │ │ ├── it.js │ │ │ │ │ ├── ja.js │ │ │ │ │ ├── km.js │ │ │ │ │ ├── ko.js │ │ │ │ │ ├── ku.js │ │ │ │ │ ├── lt.js │ │ │ │ │ ├── lv.js │ │ │ │ │ ├── mk.js │ │ │ │ │ ├── mn.js │ │ │ │ │ ├── nb.js │ │ │ │ │ ├── nl.js │ │ │ │ │ ├── no.js │ │ │ │ │ ├── pl.js │ │ │ │ │ ├── pt-br.js │ │ │ │ │ ├── pt.js │ │ │ │ │ ├── ro.js │ │ │ │ │ ├── ru.js │ │ │ │ │ ├── si.js │ │ │ │ │ ├── sk.js │ │ │ │ │ ├── sl.js │ │ │ │ │ ├── sq.js │ │ │ │ │ ├── sr-latn.js │ │ │ │ │ ├── sr.js │ │ │ │ │ ├── sv.js │ │ │ │ │ ├── th.js │ │ │ │ │ ├── tr.js │ │ │ │ │ ├── tt.js │ │ │ │ │ ├── ug.js │ │ │ │ │ ├── uk.js │ │ │ │ │ ├── vi.js │ │ │ │ │ ├── zh-cn.js │ │ │ │ │ └── zh.js │ │ │ ├── about │ │ │ │ └── dialogs │ │ │ │ │ ├── about.js │ │ │ │ │ ├── hidpi │ │ │ │ │ └── logo_ckeditor.png │ │ │ │ │ └── logo_ckeditor.png │ │ │ ├── clipboard │ │ │ │ └── dialogs │ │ │ │ │ └── paste.js │ │ │ ├── dialog │ │ │ │ └── dialogDefinition.js │ │ │ ├── icons.png │ │ │ ├── icons_hidpi.png │ │ │ ├── image │ │ │ │ ├── dialogs │ │ │ │ │ └── image.js │ │ │ │ └── images │ │ │ │ │ └── noimage.png │ │ │ ├── link │ │ │ │ ├── dialogs │ │ │ │ │ ├── anchor.js │ │ │ │ │ └── link.js │ │ │ │ └── images │ │ │ │ │ ├── anchor.png │ │ │ │ │ └── hidpi │ │ │ │ │ └── anchor.png │ │ │ ├── magicline │ │ │ │ └── images │ │ │ │ │ ├── hidpi │ │ │ │ │ ├── icon-rtl.png │ │ │ │ │ └── icon.png │ │ │ │ │ ├── icon-rtl.png │ │ │ │ │ └── icon.png │ │ │ ├── pastefromword │ │ │ │ └── filter │ │ │ │ │ └── default.js │ │ │ ├── scayt │ │ │ │ ├── LICENSE.md │ │ │ │ ├── README.md │ │ │ │ └── dialogs │ │ │ │ │ ├── options.js │ │ │ │ │ └── toolbar.css │ │ │ ├── specialchar │ │ │ │ └── dialogs │ │ │ │ │ ├── lang │ │ │ │ │ ├── _translationstatus.txt │ │ │ │ │ ├── af.js │ │ │ │ │ ├── ar.js │ │ │ │ │ ├── bg.js │ │ │ │ │ ├── ca.js │ │ │ │ │ ├── cs.js │ │ │ │ │ ├── cy.js │ │ │ │ │ ├── da.js │ │ │ │ │ ├── de.js │ │ │ │ │ ├── el.js │ │ │ │ │ ├── en-gb.js │ │ │ │ │ ├── en.js │ │ │ │ │ ├── eo.js │ │ │ │ │ ├── es.js │ │ │ │ │ ├── et.js │ │ │ │ │ ├── fa.js │ │ │ │ │ ├── fi.js │ │ │ │ │ ├── fr-ca.js │ │ │ │ │ ├── fr.js │ │ │ │ │ ├── gl.js │ │ │ │ │ ├── he.js │ │ │ │ │ ├── hr.js │ │ │ │ │ ├── hu.js │ │ │ │ │ ├── id.js │ │ │ │ │ ├── it.js │ │ │ │ │ ├── ja.js │ │ │ │ │ ├── km.js │ │ │ │ │ ├── ku.js │ │ │ │ │ ├── lt.js │ │ │ │ │ ├── lv.js │ │ │ │ │ ├── nb.js │ │ │ │ │ ├── nl.js │ │ │ │ │ ├── no.js │ │ │ │ │ ├── pl.js │ │ │ │ │ ├── pt-br.js │ │ │ │ │ ├── pt.js │ │ │ │ │ ├── ru.js │ │ │ │ │ ├── si.js │ │ │ │ │ ├── sk.js │ │ │ │ │ ├── sl.js │ │ │ │ │ ├── sq.js │ │ │ │ │ ├── sv.js │ │ │ │ │ ├── th.js │ │ │ │ │ ├── tr.js │ │ │ │ │ ├── tt.js │ │ │ │ │ ├── ug.js │ │ │ │ │ ├── uk.js │ │ │ │ │ ├── vi.js │ │ │ │ │ ├── zh-cn.js │ │ │ │ │ └── zh.js │ │ │ │ │ └── specialchar.js │ │ │ ├── table │ │ │ │ └── dialogs │ │ │ │ │ └── table.js │ │ │ ├── tabletools │ │ │ │ └── dialogs │ │ │ │ │ └── tableCell.js │ │ │ └── wsc │ │ │ │ ├── LICENSE.md │ │ │ │ ├── README.md │ │ │ │ └── dialogs │ │ │ │ ├── ciframe.html │ │ │ │ ├── tmpFrameset.html │ │ │ │ ├── wsc.css │ │ │ │ ├── wsc.js │ │ │ │ └── wsc_ie.js │ │ ├── skins │ │ │ └── moono │ │ │ │ ├── dialog.css │ │ │ │ ├── dialog_ie.css │ │ │ │ ├── dialog_ie7.css │ │ │ │ ├── dialog_ie8.css │ │ │ │ ├── dialog_iequirks.css │ │ │ │ ├── editor.css │ │ │ │ ├── editor_gecko.css │ │ │ │ ├── editor_ie.css │ │ │ │ ├── editor_ie7.css │ │ │ │ ├── editor_ie8.css │ │ │ │ ├── editor_iequirks.css │ │ │ │ ├── icons.png │ │ │ │ ├── icons_hidpi.png │ │ │ │ ├── images │ │ │ │ ├── arrow.png │ │ │ │ ├── close.png │ │ │ │ ├── hidpi │ │ │ │ │ ├── close.png │ │ │ │ │ ├── lock-open.png │ │ │ │ │ ├── lock.png │ │ │ │ │ └── refresh.png │ │ │ │ ├── lock-open.png │ │ │ │ ├── lock.png │ │ │ │ └── refresh.png │ │ │ │ └── readme.md │ │ └── styles.js │ │ ├── jquery-1.11.1.js │ │ ├── jquery-1.11.1.min.js │ │ ├── material.js │ │ ├── material.min.js │ │ ├── ripples.js │ │ └── ripples.min.js └── templates │ ├── about.html │ ├── admin │ ├── create_post.html │ ├── edit_post.html │ ├── index.html │ └── my_master.html │ ├── base.html │ ├── blog.html │ ├── blog_base.html │ ├── category_blog.html │ └── index.html ├── config.py ├── etc ├── db.sql ├── flaskblog └── flaskblog.conf ├── fabfile.py ├── manage.py ├── requirements.txt ├── run.py ├── setup.py └── wsgi_gunicorn.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.orig 3 | .idea/* 4 | **/*.log 5 | *idea* 6 | *.iml 7 | flaskblog.egg-info/* 8 | venv/ 9 | 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | flaskblog 2 | ========= 3 | 4 | Learn python and flask,just a tony blog system based on flask and mysql 5 | It is similar to [cleanblog](https://github.com/defshine/cleanblog), a blog system based on flask and mongoengine 6 | 7 | 8 | ###Version:v0.2-dev 9 | 10 | ##Use: 11 | 12 | ###Backend: 13 | 14 | 1. [Flask](http://flask.pocoo.org/) 15 | 2. [Flask-SQLAlchemy](https://pythonhosted.org/Flask-SQLAlchemy/) ORM for mysql 16 | 3. [Flask-WTF](https://flask-wtf.readthedocs.org/en/latest/) 17 | 4. [Flask-Login](https://flask-login.readthedocs.org/en/latest/) 18 | 5. [Flask-Admin](http://flask-admin.readthedocs.org/en/latest/) 19 | 6. [Flask-Script](http://flask-script.readthedocs.org/en/latest/) 20 | 7. [Flask-Cache](http://www.pythondoc.com/flask-cache/index.html) 21 | 22 | ###Web: 23 | 24 | 1. [Bootstrap-3.2.0](http://getbootstrap.com/) 25 | 2. [bootstrap-material-design](https://github.com/FezVrasta/bootstrap-material-design) 26 | 3. [CKEditor 4.4.7_standard](http://ckeditor.com/) 27 | 28 | ##Finish: 29 | 30 | ####The basic function of blog: 31 | 32 | > Post:read,write,edit,delete 33 | > Category:read,add,edit,delete 34 | > Comment: use duoshuo 35 | > Blogroll: add,list 36 | 37 | ####Develop simple restful api 38 | 39 |
URL | 42 |Method | 43 |Description | 44 |
/api/posts | 47 |GET | 48 |Gives a list of all posts | 49 |
/api/posts/post_id | 52 |GET | 53 |Gives a posts by post_id | 54 |
/api/categories/category_id/posts | 57 |GET | 58 |Gives a list of posts by category_id | 59 |
/api/categories | 62 |GET | 63 |Gives a list of all categories | 64 |
/api/categories/category_id | 67 |GET | 68 |Gives a categories by category_id | 69 |
CKEditor '+CKEDITOR.version+" (revision "+CKEDITOR.revision+')
http://ckeditor.com
'+a.help.replace("$1",''+ 7 | a.userGuide+"")+"
"+a.moreInfo+'
http://ckeditor.com/about/license
'+a.copy.replace("$1",'CKSource - Frederico Knabben')+"
'+a.lang.wsc.errorLoading.replace(/%s/g,a.config.wsc_customLoaderScript)+"
");window._cancelOnError=function(c){if("undefined"==typeof window.WSC_Error){CKEDITOR.document.getById(d).setStyle("display", 9 | "none");var b=CKEDITOR.document.getById(h);b.setStyle("display","block");b.setHtml(c||a.lang.wsc.notAvailable)}};return{title:a.config.wsc_dialogTitle||a.lang.wsc.title,minWidth:485,minHeight:380,buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var b=this.getContentElement("general","content").getElement();b.setHtml(k);b.getChild(2).setStyle("height",this._.contentSize.height+"px");"function"!=typeof window.doSpell&&CKEDITOR.document.getHead().append(CKEDITOR.document.createElement("script", 10 | {attributes:{type:"text/javascript",src:l}}));b=a.getData();CKEDITOR.document.getById(g).setValue(b);e=window.setInterval(c(this,i),250)},onHide:function(){window.ooo=void 0;window.int_framsetLoaded=void 0;window.framesetLoaded=void 0;window.is_window_opened=!1},contents:[{id:"general",label:a.config.wsc_dialogTitle||a.lang.wsc.title,padding:0,elements:[{type:"html",id:"content",html:""}]}]}}); 11 | CKEDITOR.dialog.on("resize",function(a){var a=a.data,c=a.dialog;"checkspell"==c._.name&&((c=(c=c.getContentElement("general","content").getElement())&&c.getChild(2))&&c.setSize("height",a.height),c&&c.setSize("width",a.width))}); -------------------------------------------------------------------------------- /app/static/js/lib/ckeditor/skins/moono/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defshine/flaskblog/b852ad76c28fe2a19a2df1d824c57a2fb76785ad/app/static/js/lib/ckeditor/skins/moono/icons.png -------------------------------------------------------------------------------- /app/static/js/lib/ckeditor/skins/moono/icons_hidpi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defshine/flaskblog/b852ad76c28fe2a19a2df1d824c57a2fb76785ad/app/static/js/lib/ckeditor/skins/moono/icons_hidpi.png -------------------------------------------------------------------------------- /app/static/js/lib/ckeditor/skins/moono/images/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defshine/flaskblog/b852ad76c28fe2a19a2df1d824c57a2fb76785ad/app/static/js/lib/ckeditor/skins/moono/images/arrow.png -------------------------------------------------------------------------------- /app/static/js/lib/ckeditor/skins/moono/images/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defshine/flaskblog/b852ad76c28fe2a19a2df1d824c57a2fb76785ad/app/static/js/lib/ckeditor/skins/moono/images/close.png -------------------------------------------------------------------------------- /app/static/js/lib/ckeditor/skins/moono/images/hidpi/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defshine/flaskblog/b852ad76c28fe2a19a2df1d824c57a2fb76785ad/app/static/js/lib/ckeditor/skins/moono/images/hidpi/close.png -------------------------------------------------------------------------------- /app/static/js/lib/ckeditor/skins/moono/images/hidpi/lock-open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defshine/flaskblog/b852ad76c28fe2a19a2df1d824c57a2fb76785ad/app/static/js/lib/ckeditor/skins/moono/images/hidpi/lock-open.png -------------------------------------------------------------------------------- /app/static/js/lib/ckeditor/skins/moono/images/hidpi/lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defshine/flaskblog/b852ad76c28fe2a19a2df1d824c57a2fb76785ad/app/static/js/lib/ckeditor/skins/moono/images/hidpi/lock.png -------------------------------------------------------------------------------- /app/static/js/lib/ckeditor/skins/moono/images/hidpi/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defshine/flaskblog/b852ad76c28fe2a19a2df1d824c57a2fb76785ad/app/static/js/lib/ckeditor/skins/moono/images/hidpi/refresh.png -------------------------------------------------------------------------------- /app/static/js/lib/ckeditor/skins/moono/images/lock-open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defshine/flaskblog/b852ad76c28fe2a19a2df1d824c57a2fb76785ad/app/static/js/lib/ckeditor/skins/moono/images/lock-open.png -------------------------------------------------------------------------------- /app/static/js/lib/ckeditor/skins/moono/images/lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defshine/flaskblog/b852ad76c28fe2a19a2df1d824c57a2fb76785ad/app/static/js/lib/ckeditor/skins/moono/images/lock.png -------------------------------------------------------------------------------- /app/static/js/lib/ckeditor/skins/moono/images/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defshine/flaskblog/b852ad76c28fe2a19a2df1d824c57a2fb76785ad/app/static/js/lib/ckeditor/skins/moono/images/refresh.png -------------------------------------------------------------------------------- /app/static/js/lib/ckeditor/skins/moono/readme.md: -------------------------------------------------------------------------------- 1 | "Moono" Skin 2 | ==================== 3 | 4 | This skin has been chosen for the **default skin** of CKEditor 4.x, elected from the CKEditor 5 | [skin contest](http://ckeditor.com/blog/new_ckeditor_4_skin) and further shaped by 6 | the CKEditor team. "Moono" is maintained by the core developers. 7 | 8 | For more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK) 9 | documentation. 10 | 11 | Features 12 | ------------------- 13 | "Moono" is a monochromatic skin, which offers a modern look coupled with gradients and transparency. 14 | It comes with the following features: 15 | 16 | - Chameleon feature with brightness, 17 | - high-contrast compatibility, 18 | - graphics source provided in SVG. 19 | 20 | Directory Structure 21 | ------------------- 22 | 23 | CSS parts: 24 | - **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance, 25 | - **mainui.css**: the file contains styles of entire editor outline structures, 26 | - **toolbar.css**: the file contains styles of the editor toolbar space (top), 27 | - **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar, 28 | - **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded 29 | until the first panel open up, 30 | - **elementspath.css**: the file contains styles of the editor elements path bar (bottom), 31 | - **menu.css**: the file contains styles of all editor menus including context menu and button drop-down, 32 | it's not loaded until the first menu open up, 33 | - **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open, 34 | - **reset.css**: the file defines the basis of style resets among all editor UI spaces, 35 | - **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference, 36 | - **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks. 37 | 38 | Other parts: 39 | - **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature, 40 | - **icons/**: contains all skin defined icons, 41 | - **images/**: contains a fill general used images, 42 | - **dev/**: contains SVG source of the skin icons. 43 | 44 | License 45 | ------- 46 | 47 | Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. 48 | 49 | Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html). 50 | 51 | See LICENSE.md for more information. 52 | -------------------------------------------------------------------------------- /app/static/js/lib/material.js: -------------------------------------------------------------------------------- 1 | /* globals ripples */ 2 | 3 | $(function (){ 4 | 5 | if (typeof ripples == "object") { 6 | ripples.init( ".btn:not(.btn-link)," + 7 | ".card-image," + 8 | ".navbar a:not(.withoutripple)," + 9 | ".nav-tabs a:not(.withoutripple)," + 10 | ".withripple" ); 11 | } 12 | 13 | var initInputs = function() { 14 | // Add fake-checkbox to material checkboxes 15 | $(".checkbox > label > input").not(".bs-material").addClass("bs-material").after(""); 16 | 17 | // Add fake-radio to material radios 18 | $(".radio > label > input").not(".bs-material").addClass("bs-material").after(""); 19 | 20 | // Add elements for material inputs 21 | $("input.form-control, textarea.form-control, select.form-control").not(".bs-material").each( function() { 22 | if ($(this).is(".bs-material")) { return; } 23 | $(this).wrap(""); 24 | $(this).after(""); 25 | if ($(this).hasClass("floating-label")) { 26 | var placeholder = $(this).attr("placeholder"); 27 | $(this).attr("placeholder", null).removeClass("floating-label"); 28 | $(this).after("15 |21 |Java,Spring,Hiberante,MyBatis
20 |
16 | Python,Flask
17 | MySql,MongoDB
18 | jQuery,AngularJS
19 | Linux,Git
39 |41 |Build web app based on Flask and MongoEngine
40 |
Free online:Flask Tutorial
42 |Buy pdf,mobi,epub ebook on SelfStore
43 |This is the backend of FlaskBlog.
10 |You can operate all posts here
11 | {% else %} 12 | 29 | {{ link | safe }} 30 | {% endif %} 31 |Software engineer,focus on Java and Python.
17 | 18 |