1.1.第一個flask程序
from flask import Flask #建立一個Flask對象,傳遞__name__參數進去 app = Flask(__name__) #url與視圖映射 @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run() #flask中的一個測試應用服務器
瀏覽器訪問:http://127.0.0.1:5000/,也能夠更改端口號: app.run(port=5001)html
1.2.debug模式
做用:前端
- 若是拋出異常,在瀏覽器中能夠看到具體錯誤信息
- 在修改代碼後,只要按「ctrl+s」,就會自動重啓項目,不用手動從新運行
四種配置方式json
第一種flask
if __name__ == '__main__': app.run(debug=True)
第二種瀏覽器
app.debug = True
第三種服務器
app.config.update(DEBUG=True)
第四種app
新建config.pyide
DEBUG = Ture
而後在主程序總導入引用函數
import config app.config.from_object(config)
from flask import Flask import config #建立一個Flask對象,傳遞__name__參數進去 app = Flask(__name__) # app.debug = True #第二種 # app.config.update(DEBUG=True) #第三種 app.config.from_object(config) #第四種 #url與視圖映射 @app.route('/') def hello_world(): print('helloworkl') return 'Hello World!' if __name__ == '__main__': # app.run(debug=True) #第一種 app.run()
1.3.配置文件
新建config.pypost
DEBUG =True
主程序中兩種引用方式
第一種:
import config app.config.from_object(config)
第二種
app.config.from_pyfile('config.py')
1.4.url傳參方式
普通傳參方式
@app.route('/p/<id>/') def article_detail(id): return '你訪問的文章第%s篇'%id
指定參數類型
有如下幾種類型:
- string:默認的數據類型
- int:接受整形
- float:浮點型
- path:和string的相似,可是接受斜槓
- any:能夠指定多個路徑
- uuid:只接受uuid字符串
(1)any
@app.route('/<any(blog,user):url_path>/<id>') def detail(url_path,id): if url_path == 'blog': return '博客詳情%s'%id else: return '用戶詳情%s'%id
(2)path
@app.route('/article/<path:test>/') def test_article(test): return 'test_article:{}'.format(test)
獲取參數
from flask import Flask,request @app.route('/tieba/') def tieba(): wd = request.args.get('wd') return '獲取的參數的是%s'%wd
1.5.url_for的使用
(1)經過視圖函數解析出url
from flask import Flask,url_for @app.route('/') def hello_world(): return url_for('my_list',page=2) #url_for裏面:第一個是視圖函數,第二個是url須要的參數 @app.route('/list/<page>/') def my_list(page): return 'my_list'
(2)url_for裏面多的參數會當作搜索字符
@app.route('/') def hello_world(): return url_for('my_list',page=2,count=2) @app.route('/list/<page>/') def my_list(page): return 'my_list'
1.6.Response
視圖函數中能夠返回的類型
- 能夠返回字符串,返回的字符串其實底層將這個字符串包裝成了一個‘Response’對象
- 能夠返回元組,形式(響應體,狀態碼,頭部信息),返回的元組其實底層將這個字符串包裝成了一個‘Response’對象
- 能夠返回Response及其子類
實現一個自定義的Response對象
- 繼承自、‘Response’類
- 實現方法‘force_type’
- 指定‘app.response_class’爲你自定義的‘Response’對象
- 若是視圖函數返回的數據,不是字符串,也不是元組,也不是Response對象,那麼就會將返回值傳給‘force_type’,而後將‘force_type’的返回值返回給前端
實例:
from flask import Flask,url_for,Response,jsonify app = Flask(__name__) class JsonResponse(Response): @classmethod def force_type(cls, response, environ=None): ''' 這個方法只有視圖函數返回非字符、非元祖、非Response對象纔會調用 :param response: :param environ: :return: ''' #把字典轉換成json if isinstance(response,dict): #jsonify將字典轉換成json對象,還將該對象包裝成了一個Response對象 response = jsonify(response) return super(JsonResponse, cls).force_type(response,environ) app.response_class = JsonResponse @app.route('/') def hello_world(): return 'Hello world' @app.route('/list1/') def list1(): return Response('list1') #合法對象,直接返回 @app.route('/list3/') def list3(): return {'username':'derek','age':18} #返回的是非字符、非元祖、非Response對象,因此執行force_type方法 if __name__ == '__main__': app.run(debug=True)
由於/list3/返回的是字典類型,非字符、非元祖、非Response對象,因此執行force_type方法
1.7.add_url_rule
主程序
from flask import Flask,render_template,url_for app = Flask(__name__) app.config.update({ 'DEBUG':True, 'TEMPLATES_AUTO_RELOAD':True }) @app.route('/',endpoint='index') def hello_world(): print(url_for("derek_list")) #經過endpoint找到對應的url /list/ return render_template('index.html') def my_list(): return "列表頁" #三個參數 #1.url #2.給url起個別名,若是沒有指定endpoint,則默認使用視圖函數的名字做爲endpoint的值 #3.視圖函數 app.add_url_rule('/list/',endpoint='derek_list',view_func=my_list) with app.test_request_context(): print(url_for('index')) # / if __name__ == '__main__': app.run()
1.8.類視圖
以前使用的視圖都是函數,簡稱爲視圖函數,視圖也能夠基於類來實現,類視圖的好處是支持繼承,類視圖須要經過app.add_url_role(url_rule,view_func)來進行註冊,類裏面要加裝飾器就用:detactors=[] ,裏面能夠添加多個裝飾器
(1)標準視圖
- 繼承views.VIew
- 必須實現‘dispatch_request’方法,之後請求過來後,都會執行這個方法,返回值至關於視圖函數同樣,必須返回'Response'或者子類的對象,或者是字符串,或者是元祖
- 必須經過app.add_url_role(url_rule,view_func)來作url與視圖的映射
實例
from flask import Flask,url_for,views app = Flask(__name__) app.config.update({ 'DEBUG':True, 'TEMPLATES_AUTO_RELOAD':True }) class ListView(views.View): def dispatch_request(self): return "個人列表頁" # 1.ListView.as_view('list')裏面必須傳個參數‘name’,給view_func起個別名,實際上就是dispatch_request函數 # 2.endpoint也能夠不指定,則默認使用view_func的別名(name參數的值) app.add_url_rule('/list/',endpoint='list',view_func=ListView.as_view('list')) @app.route('/') def hello_world(): return 'Hello World!' with app.test_request_context(): print(url_for('list')) #/list/ if __name__ == '__main__': app.run()
(2)經過類的繼承實現多個視圖返回json數據
from flask import Flask,url_for,views,jsonify app = Flask(__name__) app.config.update({ 'DEBUG':True, 'TEMPLATES_AUTO_RELOAD':True }) #父類,把數據轉換成json格式 class JsonView(views.View): def get_data(self): raise NotImplementedError def dispatch_request(self): return jsonify(self.get_data()) #子類只須要寫get_data方法 class ListView(JsonView): def get_data(self): return {"usernmae":'derek','age':18} app.add_url_rule('/list/',endpoint='list',view_func=ListView.as_view('list')) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()
(3)基於調度方法的類視圖
class LoginView(views.MethodView): def __render(self,error=None): return render_template('login.html', error=error) def get(self,error=None): return self.__render() def post(self): username = request.form.get('username') password = request.form.get('password') if username == 'derek' and password == '123': return '登陸成功' else: return self.__render(error='用戶名或密碼錯誤') app.add_url_rule('/login/',view_func=LoginView.as_view('login'))