flask框架的學習

---恢復內容開始---css

第一個flask程序講解:
1. 第一次建立項目的時候,要添加flask的虛擬環境。添加虛擬環境的時候,必定要選擇到python這個執行文件。
好比你的flask的虛擬環境的目錄在/User/Virtualenv/flask-env/bin/python。
2. flask程序代碼的詳細解釋:
```
# 從flask這個框架中導入Flask這個類
from flask import Flaskhtml

# 初始化一個Flask對象
# Flaks()
# 須要傳遞一個參數__name__
# 1. 方便flask框架去尋找資源
# 2. 方便flask插件好比Flask-Sqlalchemy出現錯誤的時候,好去尋找問題所在的位置
app = Flask(__name__)python


# @app.route是一個裝飾器
# @開頭,而且在函數的上面,說明是裝飾器
# 這個裝飾器的做用,是作一個url與視圖函數的映射
# 127.0.0.1:5000/ -> 去請求hello_world這個函數,而後將結果返回給瀏覽器
@app.route('/')
def hello_world():
return '我是第一個flask程序'mysql


# 若是當前這個文件是做爲入口程序運行,那麼就執行app.run()
if __name__ == '__main__':
# app.run()
# 啓動一個應用服務器,來接受用戶的請求
# while True:
# listen()
app.run()
```web

### 設置debug模式:
1. 在app.run()中傳入一個關鍵字參數debug,app.run(debug=True),就設置當前項目爲debug模式。
2. debug模式的兩大功能:
* 當程序出現問題的時候,能夠在頁面中看到錯誤信息和出錯的位置。
* 只要修改了項目中的`python`文件,程序會自動加載,不須要手動從新啓動服務器。sql

### 使用配置文件:
1. 新建一個`config.py`文件
2. 在主app文件中導入這個文件,而且配置到`app`中,示例代碼以下:
```
import config
app.config.from_object(config)
```
3. 還有許多的其餘參數,都是放在這個配置文件中,好比`SECRET_KEY`和`SQLALCHEMY`這些配置,都是在這個文件中。數據庫

### url傳參數:
1. 參數的做用:能夠在相同的URL,可是指定不一樣的參數,來加載不一樣的數據。
2. 在flask中如何使用參數:
```
@app.route('/article/<id>')
def article(id):
return u'您請求的參數是:%s' % id
```
* 參數須要放在兩個尖括號中。
* 視圖函數中須要放和url中的參數同名的參數。flask

### 反轉URL:
1. 什麼叫作反轉URL:從視圖函數到url的轉換叫作反轉url
2. 反轉url的用處:
* 在頁面重定向的時候,會使用url反轉。
* 在模板中,也會使用url反轉。windows

### 頁面跳轉和重定向
1. 用處:在用戶訪問一些須要登陸的頁面的時候,若是用戶沒有登陸,那麼可讓她重定向到登陸頁面。
2. 代碼實現:
```
from flask import redirect,url
redirect(url_for('login'))
```瀏覽器

 

 

模板jingjia2

### Flask渲染Jinja2模板和傳參:
1. 如何渲染模板:
* 模板放在`templates`文件夾下
* 從`flask`中導入`render_template`函數。
* 在視圖函數中,使用`render_template`函數,渲染模板。注意:只須要填寫模板的名字,不須要填寫`templates`這個文件夾的路徑。
2. 模板傳參:
* 若是隻有一個或者少許參數,直接在`render_template`函數中添加關鍵字參數就能夠了。
* 若是有多個參數的時候,那麼能夠先把全部的參數放在字典中,而後在`render_template`中,
使用兩個星號,把字典轉換成關鍵參數傳遞進去,這樣的代碼更方便管理和使用。
3. 在模板中,若是要使用一個變量,語法是:`{{params}}`
4. 訪問模型中的屬性或者是字典,能夠經過`{{params.property}}`的形式,或者是使用`{{params['age']}}`.

### 過濾器:
1. 介紹和語法:
* 介紹:過濾器能夠處理變量,把原始的變量通過處理後再展現出來。做用的對象是變量。
* 語法:
```
{{ avatar|default('xxx') }}
```
2. default過濾器:若是當前變量不存在,這時候能夠指定默認值。
3. length過濾器:求列表或者字符串或者字典或者元組的長度。
4. 經常使用的過濾器:
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判斷:
1. 語法:
```
{% if xxx %}
{% else %}
{% endif %}
```
2. if的使用,能夠和python中相差無幾。

### for循環遍歷列表和字典:
1. 字典的遍歷,語法和`python`同樣,可使用`items()`、`keys()`、`values()`、`iteritems()`、`iterkeys()`、`itervalues()`
```
{% for k,v in user.items() %}
<p>{{ k }}:{{ v }}</p>
{% endfor %}
```
2. 列表的遍歷:語法和`python`同樣。
```
{% for website in websites %}
<p>{{ website }}</p>
{% endfor %}
```

### 繼承和block:
1. 繼承做用和語法:
* 做用:能夠把一些公共的代碼放在父模板中,避免每一個模板寫一樣的代碼。
* 語法:
```
{% extends 'base.html' %}
```
2. block實現:
* 做用:可讓子模板實現一些本身的需求。父模板須要提早定義好。
* 注意點:字模板中的代碼,必須放在block塊中。

### url連接:使用`url_for(視圖函數名稱)`能夠反轉成url。

### 加載靜態文件:
1. 語法:`url_for('static',filename='路徑')`
2. 靜態文件,flask會從`static`文件夾中開始尋找,因此不須要再寫`static`這個路徑了。
3. 能夠加載`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="">
```

 

 數據庫mysql

### Mac和Windows下數據庫的安裝:


1. Mysql爲例
2. https://dev.mysql.com/downloads/mysql/
3. Mac上安裝Mysql很簡單,直接一頓下一步安裝就能夠了。
4. 設置初始化密碼的命令是:
```
mysqladmin -uroot password [password]
```
5. windows:
*. 若是沒有安裝.net Framework 4,就在那個提示框中,找到下載的url,下載下來,安裝便可。
*. 若是沒有安裝Microsoft Visual C++ 2013 x64,那麼就須要谷歌或者百度下載這個軟件進行安裝便可。

### MySQL-python中間件的介紹與安裝:
1. 若是是在類unix系統上,直接進入虛擬環境,輸入`sudo pip install mysql-python`。
2. 若是是在windows系統上,那麼在這裏下載`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
```

    若是是python3的話 pip install pymysql 就能夠了

 

 

這裏使用SQLAlchemy數據庫框架的flask集成包,即flask-SQLAlchemy來進行數據庫操做。

 

SQLAlchemy是一個很是好的框架,簡化了數據庫的操做,即提供了高層次的ORM,也提供了低層次的SQL功能,使用起來很是方便。

 

安裝方式與以前類型,仍是pip命令

1
pip3.6 install flask-sqlalchemy

 

 

### Flask-SQLAlchemy的介紹與安裝:


1. ORM:Object Relationship Mapping(模型關係映射)。
2. flask-sqlalchemy是一套ORM框架。
3. ORM的好處:可讓咱們操做數據庫跟操做對象是同樣的,很是方便。由於一個表就抽象成一個類,一條數據就抽象成該類的一個對象。
4. 安裝`flask-sqlalchemy`:`sudo pip install flask-sqlalchemy`。

### Flask-SQLAlchemy的使用:
1. 初始化和設置數據庫配置信息:
* 使用flask_sqlalchemy中的SQLAlchemy進行初始化:
```
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
```
2. 設置配置信息:先建立一個`config.py`文件,並在其中中添加如下配置信息
```
# dialect+driver://username:password@host:port/database   -->這是格式

import os


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         # 注意:    固定格式和變量名

SECRET_KEY = os.urandom(24)


```

3. 在主`app`文件中,添加配置文件:
```

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config

from flask import redirect,url_for,render_template

app = Flask(__name__)
app.config.from_object(config) ### 注意這一句必定要在 db = SQLAlchemy(app) 以前 不然報錯

db = SQLAlchemy(app)


@app.route('/')
def hello_world():
return 'Hello World!'

if __name__ == '__main__':
app.run(debug=True)

```
4. 作測試,看有沒有問題:
```
db.create_all()
```
若是沒有報錯,說明配置沒有問題,若是有錯誤,能夠根據錯誤進行修改。

### 使用Flask-SQLAlchemy建立模型與表的映射:


1. 模型須要繼承自`db.Model`,而後須要映射到表中的屬性,必須寫成`db.Column`的數據類型。
2. 數據類型:
* `db.Integer`表明的是整形.
* `db.String`表明的是`varchar`,須要指定最長的長度。
* `db.Text`表明的是`text`。
3. 其餘參數:
* `primary_key`:表明的是將這個字段設置爲主鍵。
* `autoincrement`:表明的是這個主鍵爲自增加的。
* `nullable`:表明的是這個字段是否能夠爲空,默承認覺得空,能夠將這個值設置爲`False`,在數據庫中,這個值就不能爲空了。
4. 最後須要調用`db.create_all`來將模型真正的建立到數據庫中。

### Flask-SQLAlchemy數據的增、刪、改、查:


1. 增:
```
# 增長:
article1 = Article(title='aaa',content='bbb')
db.session.add(article1)
# 事務
db.session.commit()
```
2. 查:
```
# 查
# 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
```
3. 改:
```
# 改:
# 1. 先把你要更改的數據查找出來
article1 = Article.query.filter(Article.title == 'aaa').first()
# 2. 把這條數據,你須要修改的地方進行修改
article1.title = 'new title'
# 3. 作事務的提交
db.session.commit()
```
4. 刪:
```
# 刪
# 1. 把須要刪除的數據查找出來
article1 = Article.query.filter(Article.content == 'bbb').first()
# 2. 把這條數據刪除掉
db.session.delete(article1)
# 3. 作事務提交
db.session.commit()
```

### Flask-SQLAlchemy外鍵及其關係:
1. 外鍵:
```
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'))  #映射綁定
```
2. `author = db.relationship('User',backref=db.backref('articles'))`解釋:
* 給`Article`這個模型添加一個`author`屬性,能夠訪問這篇文章的做者的數據,像訪問普通模型同樣。
* `backref`是定義反向引用,能夠經過`User.articles`訪問這個模型所寫的全部文章。

3. 多對多:
* 多對多的關係,要經過一箇中間表進行關聯。
* 中間表,不能經過`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)

db.session.commit()
```
- 訪問數據:
```
article1 = Article.query.filter(Article.title == 'aaa').first()
tags = article1.tags
for tag in tags:
print tag.name
```

### Flask-Script的介紹與安裝:
1. Flask-Script:Flask-Script的做用是能夠經過命令行的形式來操做Flask。例如經過命令跑一個開發版本的服務器、設置數據庫,定時任務等。
2. 安裝:首先進入到虛擬環境中,而後`pip install flask-script`來進行安裝。
3. 若是直接在主`manage.py`中寫命令,那麼在終端就只須要`python manage.py command_name`就能夠了。
4. 若是把一些命令集中在一個文件中,那麼在終端就須要輸入一個父命令,好比`python manage.py db init`。
5. 例子:
```
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)

if __name__ == '__main__':
manager.run()
```
6. 有子命令的例子:
```
#encoding: utf-8

from flask_script import Manager

DBManager = Manager()

@DBManager.command
def init():
print '數據庫初始化完成'

@DBManager.command
def migrate():
print '數據表遷移成功'
```

### 分開`models`以及解決循環引用:
1. 分開models的目的:爲了讓代碼更加方便的管理。
2. 如何解決循環引用:把`db`放在一個單獨的文件中,切斷循環引用的線條就能夠了。


### Flask-Migrate的介紹與安裝:
1. 介紹:由於採用`db.create_all`在後期修改字段的時候,不會自動的映射到數據庫中,必須刪除表,而後從新運行`db.craete_all`纔會從新映射,這樣不符合咱們的需求。所以flask-migrate就是爲了解決這個問題,她能夠在每次修改模型後,能夠將修改的東西映射到數據庫中。
2. 首先進入到你的虛擬環境中,而後使用`pip install flask-migrate`進行安裝就能夠了。
3. 使用`flask_migrate`必須藉助`flask_scripts`,這個包的`MigrateCommand`中包含了全部和數據庫相關的命令。
4. `flask_migrate`相關的命令:
* `python manage.py db init`:初始化一個遷移腳本的環境,只須要執行一次。
* `python manage.py db migrate`:將模型生成遷移文件,只要模型更改了,就須要執行一遍這個命令。
* `python manage.py db upgrade`:將遷移文件真正的映射到數據庫中。每次運行了`migrate`命令後,就記得要運行這個命令。
5. 注意點:須要將你想要映射到數據庫中的模型,都要導入到`manage.py`文件中,若是沒有導入進去,就不會映射到數據庫中。
6. `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()
```

 

 

---恢復內容結束---

相關文章
相關標籤/搜索