1. 程式人生 > >flask框架的學習

flask框架的學習

其中 scrip div 詳細 跳轉 如何 ack sele 請求

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

第一個flask程序講解:
1. 第一次創建項目的時候,要添加flask的虛擬環境。添加虛擬環境的時候,一定要選擇到python這個執行文件。
比如你的flask的虛擬環境的目錄在/User/Virtualenv/flask-env/bin/python。
2. 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()
```

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

### 使用配置文件:
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中的參數同名的參數。

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

### 頁面跳轉和重定向
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‘) }}" >
```

數據庫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++ 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 就可以了

### 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

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()
```

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

flask框架的學習