知了課堂Python Flask零基礎到項目實戰系列視頻的全部筆記,現整理在下,視頻地址:css
筆記目錄:python
>>> import flask >>> print flask.__version__
http://baike.baidu.com/link?url=ELcglgxAgFQ9WlMytXEhxu-WBtI7mTlDj3TJ-Ht6ZSecAYt0hgqY0euqaB60opaEEZ7JChin5vUd_YkOgMi7BT5kc3E85ZXeoVL2iVfKZu_jHMcNabK8NXilqnfJknKsmysql
http://baike.baidu.com/link?url=ELcglgxAgFQ9WlMytXEhxu-WBtI7mTlDj3TJ-Ht6ZSecAYt0hgqY0euqaB60opaEEZ7JChin5vUd_YkOgMi7BT5kc3E85ZXeoVL2iVfKZu_jHMcNabK8NXilqnfJknKs#3linux
http://baike.baidu.com/link?url=ELcglgxAgFQ9WlMytXEhxu-WBtI7mTlDj3TJ-Ht6ZSecAYt0hgqY0euqaB60opaEEZ7JChin5vUd_YkOgMi7BT5kc3E85ZXeoVL2iVfKZu_jHMcNabK8NXilqnfJknKs#5nginx
URL是Uniform Resource Locator的簡寫,統一資源定位符。web
一個URL由如下幾部分組成:sql
scheme://host:port/path/?query-string=xxx#anchor
scheme:表明的是訪問的協議,通常爲http或者https以及ftp等。
host:主機名,域名,好比www.baidu.com。
port:端口號。當你訪問一個網站的時候,瀏覽器默認使用80端口。
path:查找路徑。好比:www.jianshu.com/trending/now,後面的trending/now就是path。
query-string:查詢字符串,好比:www.baidu.com/s?wd=python,後面的wd=python就是查詢字符串。
anchor:錨點,後臺通常不用管,前端用來作頁面定位的。
web服務器:負責處理http請求,響應靜態文件,常見的有Apache,Nginx以及微軟的IIS.
應用服務器:負責處理邏輯的服務器。好比php、python的代碼,是不能直接經過nginx這種web服務器來處理的,只能經過應用服務器來處理,常見的應用服務器有uwsgi、tomcat等。
web應用框架:通常使用某種語言,封裝了經常使用的web功能的框架就是web應用框架,flask、Django以及Java中的SSH(Structs2+Spring3+Hibernate3)框架都是web應用框架。
flask程序代碼的詳細解釋:
```
# 從flask這個框架中導入Flask這個類
from flask import Flask
# 初始化一個Flask對象
# Flaks()
# 須要傳遞一個參數__name__
# 1. 方便flask框架去尋找資源
# 2. 方便flask插件好比Flask-Sqlalchemy出現錯誤的時候,好去尋找問題所在的位置
app = Flask(name)
```
# @app.route是一個裝飾器
# @開頭,而且在函數的上面,說明是裝飾器
# 這個裝飾器的做用,是作一個url與視圖函數的映射
# 127.0.0.1:5000/ -> 去請求hello_world這個函數,而後將結果返回給瀏覽器
@app.route('/')
def hello_world():
return '我是第一個flask程序'
# 若是當前這個文件是做爲入口程序運行,那麼就執行app.run()
if name == 'main':
# app.run()
# 啓動一個應用服務器,來接受用戶的請求
# while True:
# listen()
app.run()
```
python
文件,程序會自動加載,不須要手動從新啓動服務器。config.py
文件app
中,示例代碼以下:import config app.config.from_object(config)
SECRET_KEY
和SQLALCHEMY
這些配置,都是在這個文件中。@app.route('/article/<id>') def article(id): return u'您請求的參數是:%s' % id
from flask import redirect,url redirect(url_for('login'))
url_for(視圖函數名稱)
能夠反轉成url。url_for('static',filename='路徑')
static
文件夾中開始尋找,因此不須要再寫static
這個路徑了。css
文件,能夠加載js
文件,還有image
文件。第一個:加載css文件 <link rel="stylesheet" href="{{ url_for('static',filename='css/index.css') }}"> 第二個:加載js文件 <script src="{{ url_for('static',filename='js/index.js') }}"></script> 第三個:加載圖片文件 <img src="{{ url_for('static',filename='images/zhiliao.png') }}" alt="">
?
的形式來指定key和value的。form data
的形式發送給服務器的。flask.request.args
來獲取。flask.request.form
來獲取。method='post'
,而且要指定action='/login/'
。<form action="{{ url_for('login') }}" method="post"> <table> <tbody> <tr> <td>用戶名:</td> <td><input type="text" placeholder="請輸入用戶名" name="username"></td> </tr> <tr> <td>密碼:</td> <td><input type="text" placeholder="請輸入密碼" name="password"></td> </tr> <tr> <td></td> <td><input type="submit" value="登陸"></td> </tr> </tbody> </table> </form>
g:global
key
會被模板中當成變量來渲染。cookie
出現的緣由:在網站中,http請求是無狀態的。也就是說即便第一次和服務器鏈接後而且登陸成功後,第二次請求服務器依然不能知道當前請求是哪一個用戶。cookie的出現就是爲了解決這個問題,第一次登陸後服務器返回一些數據(cookie)給瀏覽器,而後瀏覽器保存在本地,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie數據自動的攜帶給服務器,服務器經過瀏覽器攜帶的數據就能判斷當前用戶是哪一個了。cookie
給瀏覽器,那麼瀏覽器下次再請求相同的服務器的時候,就會自動的把cookie
發送給瀏覽器,這個過程,用戶根本不須要管。cookie
是保存在瀏覽器中的,相對的是瀏覽器。session
介紹:session和cookie的做用有點相似,都是爲了存儲用戶相關的信息。不一樣的是,cookie是存儲在本地瀏覽器,而session存儲在服務器。存儲在服務器的數據會更加的安全,不容易被竊取。但存儲在服務器也有必定的弊端,就是會佔用服務器的資源,但如今服務器已經發展至今,一些session信息仍是綽綽有餘的。session
的好處:
session_id
,服務器將session_id
和敏感數據作一個映射存儲在session
(在服務器上面)中,更加安全。session
能夠設置過時時間,也從另一方面,保證了用戶的帳號安全。session
中,而後再把session
存放到cookie
中,下次請求的時候,再從瀏覽器發送過來的cookie
中讀取session
,而後再從session
中讀取敏感數據,並進行解密,獲取最終的用戶數據。session
機制,能夠節省服務器的開銷,由於把全部的信息都存儲到了客戶端(瀏覽器)。session
放到cookie
中,通過加密,也是比較安全的,這點你們放心使用就能夠了。session
須要從flask
中導入session
,之後全部和sessoin
相關的操做都是經過這個變量來的。session
須要設置SECRET_KEY
,用來做爲加密用的。而且這個SECRET_KEY
若是每次服務器啓動後都變化的話,那麼以前的session
就不能再經過當前這個SECRET_KEY
進行解密了。session
的時候,跟操做字典是同樣的。session
:session['username']
。session.pop('username')
或者del session['username']
。session
:session.clear()
session
:session.get('username')
app.config
設置PERMANENT_SESSION_LIFETIME
來更改過時時間,這個值的數據類型是datetime.timedelay
類型。templates
文件夾下flask
中導入render_template
函數。render_template
函數,渲染模板。注意:只須要填寫模板的名字,不須要填寫templates
這個文件夾的路徑。render_template
函數中添加關鍵字參數就能夠了。render_template
中,{{params}}
{{params.property}}
的形式,或者是使用{{params['age']}}
.{{ avatar|default('xxx') }}
經常使用的過濾器:
abs(value):返回一個數值的絕對值。示例:-1|abs
default(value,default_value,boolean=false):若是當前變量沒有值,則會使用參數中的值來代替。示例:name|default('xiaotuo')——若是name不存在,則會使用xiaotuo來替代。boolean=False默認是在只有這個變量爲undefined的時候纔會使用default中的值,若是想使用python的形式判斷是否爲false,則能夠傳遞boolean=true。也可使用or來替換。
escape(value)或e:轉義字符,會將<、>等符號轉義成HTML中的符號。示例:content|escape或content|e。
first(value):返回一個序列的第一個元素。示例:names|first
format(value,*arags,**kwargs):格式化字符串。好比:
{{ "%s" - "%s"|format('Hello?',"Foo!") }}
將輸出:Helloo? - Foo!
last(value):返回一個序列的最後一個元素。示例:names|last。
length(value):返回一個序列或者字典的長度。示例:names|length。
join(value,d=u''):將一個序列用d這個參數的值拼接成字符串。
safe(value):若是開啓了全局轉義,那麼safe過濾器會將變量關掉轉義。示例:content_html|safe。
int(value):將值轉換爲int類型。
float(value):將值轉換爲float類型。
lower(value):將字符串轉換爲小寫。
upper(value):將字符串轉換爲小寫。
replace(value,old,new): 替換將old替換爲new的字符串。
truncate(value,length=255,killwords=False):截取length長度的字符串。
striptags(value):刪除字符串中全部的HTML標籤,若是出現多個空格,將替換成一個空格。
trim:截取字符串前面和後面的空白字符。
string(value):將變量轉換成字符串。
wordcount(s):計算一個長字符串中單詞的個數。
{% if xxx %} {% else %} {% endif %}
python
同樣,可使用items()
、keys()
、values()
、iteritems()
、iterkeys()
、itervalues()
{% for k,v in user.items() %} <p>{{ k }}:{{ v }}</p> {% endfor %}
python
同樣。{% for website in websites %} <p>{{ website }}</p> {% endfor %}
{% extends 'base.html' %}
mysqladmin -uroot password [password]
sudo pip install mysql-python
。http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python
下載MySQL_python‑1.2.5‑cp27‑none‑win_amd64.whl
,而後在命令行中,進入到MySQL_python‑1.2.5‑cp27‑none‑win_amd64.whl
所在的目錄,輸入如下命令進行安裝:pip install MySQL_python‑1.2.5‑cp27‑none‑win_amd64.whl
flask-sqlalchemy
:sudo pip install flask-sqlalchemy
。from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) db = SQLAlchemy(app)
設置配置信息:在config.py
文件中添加如下配置信息:
```
# dialect+driver://username:password@host:port/database
DIALECT = 'mysql'
DRIVER = 'mysqldb'
USERNAME = 'root'
PASSWORD = 'root'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'db_demo1'
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST
,PORT,DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False
```
app
文件中,添加配置文件:app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app)
作測試,看有沒有問題:
db.create_all()
若是沒有報錯,說明配置沒有問題,若是有錯誤,能夠根據錯誤進行修改。
db.Model
,而後須要映射到表中的屬性,必須寫成db.Column
的數據類型。db.Integer
表明的是整形.db.String
表明的是varchar
,須要指定最長的長度。db.Text
表明的是text
。primary_key
:表明的是將這個字段設置爲主鍵。autoincrement
:表明的是這個主鍵爲自增加的。nullable
:表明的是這個字段是否能夠爲空,默承認覺得空,能夠將這個值設置爲False
,在數據庫中,這個值就不能爲空了。db.create_all
來將模型真正的建立到數據庫中。# 增長: article1 = Article(title='aaa',content='bbb') db.session.add(article1) # 事務 db.session.commit()
# 查 # select * from article where article.title='aaa'; article1 = Article.query.filter(Article.title == 'aaa').first() print 'title:%s' % article1.title print 'content:%s' % article1.content
# 改: # 1. 先把你要更改的數據查找出來 article1 = Article.query.filter(Article.title == 'aaa').first() # 2. 把這條數據,你須要修改的地方進行修改 article1.title = 'new title' # 3. 作事務的提交 db.session.commit()
# 刪 # 1. 把須要刪除的數據查找出來 article1 = Article.query.filter(Article.content == 'bbb').first() # 2. 把這條數據刪除掉 db.session.delete(article1) # 3. 作事務提交 db.session.commit()
外鍵:
```
class User(db.Model):
tablename = 'user'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(100),nullable=False)
class Article(db.Model):
tablename = 'article'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(100),nullable=False)
content = db.Column(db.Text,nullable=False)
author_id = db.Column(db.Integer,db.ForeignKey('user.id'))
author = db.relationship('User',backref=db.backref('articles'))```
author = db.relationship('User',backref=db.backref('articles'))
解釋:
Article
這個模型添加一個author
屬性,能夠訪問這篇文章的做者的數據,像訪問普通模型同樣。backref
是定義反向引用,能夠經過User.articles
訪問這個模型所寫的全部文章。class
的方式實現,只能經過db.Table
的方式實現。tags = db.relationship('Tag',secondary=article_tag,backref=db.backref('articles'))
須要使用一個關鍵字參數secondary=中間表
來進行關聯。添加數據:
```
article1 = Article(title='aaa')
article2 = Article(title='bbb')
tag1 = Tag(name='111')
tag2 = Tag(name='222')
article1.tags.append(tag1)
article1.tags.append(tag2)
article2.tags.append(tag1)
article2.tags.append(tag2)
db.session.add(article1)
db.session.add(article2)
db.session.add(tag1)
db.session.add(tag2)
訪問數據:
article1 = Article.query.filter(Article.title == 'aaa').first() tags = article1.tags for tag in tags: print tag.name
pip install flask-script
來進行安裝。manage.py
中寫命令,那麼在終端就只須要python manage.py command_name
就能夠了。python manage.py db init
。例子:
```
from flask_script import Manager
from flask_script_demo import app
from db_scripts import DBManager
manager = Manager(app)
```
# 和數據庫相關的操做,我都放在一塊兒
@manager.command
def runserver():
print '服務器跑起來了!!!!!'
manager.add_command('db',DBManager)
有子命令的例子:
```
#encoding: utf-8
from flask_script import Manager
DBManager = Manager()
@DBManager.command
def init():
print '數據庫初始化完成'
@DBManager.command
def migrate():
print '數據表遷移成功'
```
models
以及解決循環引用:db
放在一個單獨的文件中,切斷循環引用的線條就能夠了。db.create_all
在後期修改字段的時候,不會自動的映射到數據庫中,必須刪除表,而後從新運行db.craete_all
纔會從新映射,這樣不符合咱們的需求。所以flask-migrate就是爲了解決這個問題,她能夠在每次修改模型後,能夠將修改的東西映射到數據庫中。pip install flask-migrate
進行安裝就能夠了。flask_migrate
必須藉助flask_scripts
,這個包的MigrateCommand
中包含了全部和數據庫相關的命令。flask_migrate
相關的命令:
python manage.py db init
:初始化一個遷移腳本的環境,只須要執行一次。python manage.py db migrate
:將模型生成遷移文件,只要模型更改了,就須要執行一遍這個命令。python manage.py db upgrade
:將遷移文件真正的映射到數據庫中。每次運行了migrate
命令後,就記得要運行這個命令。manage.py
文件中,若是沒有導入進去,就不會映射到數據庫中。manage.py
的相關代碼:
```
from flask_script import Manager
from migrate_demo import app
from flask_migrate import Migrate,MigrateCommand
from exts import db
from models import Article
# init
# migrate
# upgrade
# 模型 -> 遷移文件 -> 表
manager = Manager(app)
# 1. 要使用flask_migrate,必須綁定app和db
migrate = Migrate(app,db)
# 2. 把MigrateCommand命令添加到manager中
manager.add_command('db',MigrateCommand)
if name == 'main': manager.run() ```