Java開發需要學習哪些內容?
面向簡單需求和小型應用的框架
特點
-
內建開發伺服器和偵錯程式
-
與python的單元測試無縫連線
-
使用Jinja2模板(HTML模板)
-
完全相容WSGI
-
基於Unicode編碼
安裝
-
pip install flask
-
pip install sqlalchemy flask-wtf
HelloWorld
1 from flask import Flask 2 from flask import render_template 3 from flask import Mark 4 5 app = Flask(__name__) 6 7 @app.route('/') #繫結路由 8 def hello_world(): 9 return 'Hello World!' 10 11 @app.route('/hello/') 12 @app.route('/hello/<name>') 13 def hello(name=None): 14 name = Markup(name) #對字串做轉義處理,比如‘>’轉成> 15 return render_template('hello.html',name=name) #hello.html檔案儲存到templage目錄下16 17 # return redirect('/check') 重定向 18 # return abort(400) 返回400錯誤 19 20 @app.errorhandler(400) 21 def bad_request(error): 22 return render_template('bad_request.html',400) 23 24 if __name__ == '__main__': 25 app.run(host='0.0.0.0',port=80,debug=false) #執行應用,關閉除錯模式 26 27 # html檔案 28 <!doctype html> 29<title>Hello from Flask</title> 30 {% if name %} 31 <h1> 32 Hello {{ name }} 33 </h1> 34 {% else %} 35 <h1> 36 Hello World! 37 </h1> 38 {% endif %}
路由
-
路徑中新增變數:
-
@app.route('/login/<username>')
-
@app.route('/login/<int:number>') 此時number傳到方法的就是整型而不是字串
-
-
結尾都要加‘/’
-
Http方法繫結
-
@app.route('/sendMessage',method=['GET','POST'])
-
-
路由地址方向生成
1 import flask import Flask,url_for 2 3 app = Flask(__name__) 4 @app.route('/') 5 def f_root():pass 6 @app.route('/industry') 7 def f_industry():pass 8 @app.route('/book/<book_name>') 9 def f_book():pass 10 11 with app.test_request_context(): 12 print(url_for('f_root')) #輸出:/ 13 print(url_for('f_industry',name='web')) #輸出:/industry?name=web 14 print(url_for('f_book',book_name='Python Book')) #輸出:/book/Python%20Book
Context
-
會話上下文
-
會話與使用者是一對一的關係
-
通過Cookie實現
-
SessionID
-
-
from flask import session
-
session['xxx']=yyy
-
session.get('xxx')
-
session.new 判斷session是不是新建的
-
session.moidified 判斷session是否被修改
-
-
-
應用全域性物件
-
from flask import g
-
一般用來定義資料庫連線和斷開
-
請求上下文
-
from flask import request
-
屬性名稱 訪問URL返回的結果 base_url http://localhost/app/page.html path /page.html script_root /app url http://localhost/app/page.html?x=y url_root http://localhost/app/page.html -
屬性 作用 form POST或PUT的表單資料 args URL中的引數 values 上面兩個屬性的所有值 cookies Cookie資料 headers HEAD資料 data MIMETYPE型別資料 files FileStorage型別資料 method 訪問方式(POST,PUT,GET等) json 解析json資料 on_json_loading_failed(e) json資料解析失敗的回撥
-
-
回撥接入點
-
@app.before_request:請求呼叫前處理
-
@app.after_request:請求呼叫後處理
-
@app.teardown_request:請求呼叫後強制處理
-
JinJa2
-
{{}}:變數或表示式,{%%}:邏輯控制,{##}:註釋
-
過濾器
過濾器 描述 abs(number) 絕對值 attr(object,name) 獲取指定屬性 capitalize(s) 首字母大寫 center(value,width) 字串居中 default(value,default_value,boolean) 若無值則返回預設值 dictsort(value,case_sensitive,by) 以by的值來排序 escape(s) 轉換為HTML表達方式 filesize(value,binary) 檔案大小單位 first(sequence) 第一個元素 float(value,default) float型別 forceescape(value) 強制HTML轉碼 format(value,*attribute) 字串格式化 groupby(value,attribute) 按照共有屬性分組 indent(string,width,indentfirst) 縮排 int(value,,default) int型別 join(value,d=',') 字串使用逗號連線 last(seq) 最後一個元素 length(obj) 物件長度 list(value) 轉成列表 lower(string) 轉小寫 pprint(value,verbose) 格式化列印 random(seq) 隨機元素 replace(string,old,new,count) 替換 reverse(value) 倒序 safe(value) 標記傳入的值是安全的 slice(value,slices,fill_width) 切片 sort(value,reverse,case_sensitive,attribute) 排序 string(object) 轉字串 striptags(value) 去除標籤 sum(iterable,attribute,start) 求和 title(s) 以標題形式展示 trim(value) 去除首位空格 truncate(s,length,killwords,end) 省略字串 upper(s) 轉大寫 wordcount(s) 單詞個數 wordwrap(s,width,break_long_words,wrapstring) 字串分析處理 -
流程控制
-
測試
-
is
-
判斷 描述 allable(obj) 是否可呼叫 defined(value) 是否定義 divisibleby(value,num) 是否可被num整除 escaped(value) 是否被轉碼 even(value) 是否偶數 iterable(value) 是否可迭代 lower(value) 是否小寫 none(value) 是否為空 number(value) 是否數字 odd(value) 是否奇數 sameas(value,order) 是否在記憶體的同一塊地址 sequence(value) 是否序列 undefined(value) 是否未定義 upper(value) 是否大寫 string(value) 是否字串
-
-
判斷:{% if %}...{% elif %}...{else}...{%endif%}
-
迴圈:{% for %}...{% endfor %}
-
特殊變數
變數 描述 loop.index 迭代的次數(從1開始) loop.index0 迭代的次數(從0開始) loop.revindex 到迭代結束的次數(從1開始) loop.revindex0 到迭代結束的次數(從0開始) loop.first 是否第一次迭代 loop.last 是否最後一次迭代 loop.length 迭代長度 loop.cycle 在一串序列間取值的輔助函式
-
-
繼承
-
{% extends "base.html" %}
-
{% block xxx %}...{% endblock %}
-
-
SQLAlchemy
-
定義表
-
from sqlalchemy.ext.declarative import declarative_base
-
Base = declarative_base()
-
-
表類繼承Base類
-
__tablename__=u'account' 表在資料庫中實際的名稱
-
-
from sqlalchemy import Column,Integer,String
-
id = Column(Integer,primary_key=True)
-
user = Column(String(50),nullable=False)
-
-
-
定義資料庫連結
-
from sqlalchemy import create_engine
-
from sqlalchemy.orm import scoped_session,sessionmaker
-
建立連結
-
engine = create_engine(db_connect_string,connect_args)
-
db_connect_string格式:[database_type]://[user_name]:[password]@[domain]:[port]/[database]?[parameters]
-
例如:mysql:v_user:v_pass@localhost:3306/test_database?charset=utf8
-
-
-
建立會話型別
-
SessionType = scoped_session(sessionmaker(bind=engine,expire_on_commit=False))
-
需要定義獲取會話型別方法
1 def GetSession(): 2 return SessionType()
-
session.commit()、session.rollback()、session.close()、session.commit()
-
定義自動進行事務處理的函式
1 from contextlib import contextmanager 2 @contextmanager 3 def session_scope(): 4 session = GetSession() 5 try: 6 yield session 7 session.commit() 8 expect: 9 session.rollback() #異常時自動回滾 10 finally: 11 session.close() #退出時自動關閉,關閉時會自動提交
-
-
-
操作
-
with session_scope as session:
-
查詢:session.query().filter() 有or_、and_,兩個都需要import,在filter中使用
-
first()
-
all()
-
filter可以使用like
-
in_
-
is_,isnot
-
連線查詢join()
-
-
新增:session.add()
-
刪除:session.delete()
-
關係
-
ForeignKey():外來鍵設定
-
relationship("子表類名",backref="表名",cascade='all')
-
save_update
-
delete
-
refresh-expire
-
all
-
-
一對多:一張父表、一張子表
-
多對多:一張關係表(即父表)、多張子表
-
-
-
表單
-
Form類
-
from flask.ext.wtf import Form
-
-
Field
-
from wtforms import StringField,BooleanField,HIddenField,TextField,DateTimeField
-
-
Validator
-
顯示錶單
-
return render_template('xxx.html',form=form)
-
-
獲取表單資料
-
form.validate():判斷資料是否合法
-
form.xxx.data
-
-
REST
REST:表述性狀態傳遞
-
呼叫形式
-
GET/resource:查詢集合
-
GET/resource/ID:查詢個體
-
POST/resource:新增個體或集合
-
PUT/resource/ID:全量修改個體
-
PATCH/resource/ID:部分修改個體
-
DELETE/resource/ID:刪除個體
-
Restless外掛
-
例項化管理者物件
1 import flask_restless 2 # 例項管理這物件,關聯應用和資料庫物件 3 manager = flask_restless.APIManager(app,flask_sqlalchemy_db=db)
-
建立Restful介面
manager.create_api(XXX,methods=['GET','POST','DELETE'])
-
定製介面(以下都是create_api的引數)
-
url_prefix:定義介面的UIRL字首
-
allow_patch_many:是否允許patch
-
allow_delete_many:是否允許delete
-
include_colums:定義需要在介面可見的屬性
-
exclude_columns:和include_columns相反
-
preprocessors:介面呼叫前呼叫函式
manager.create_api(XXX,preprocessors={'POST'=[foo],'GET_SINGLE'=[trace_log]}) # []中的是方法名
-
postprocessors:介面呼叫後呼叫函式
-
鍵 | 含義 |
---|---|
POST | post請求時被呼叫 |
GET_SINGLE | get單個時被呼叫 |
GET_MANY | get集合時被呼叫 |
PATCH_SINGLE | patch單個時被呼叫 |
PATCH_MANY | patch集合時被呼叫 |
PUT_SINGLE | put單個時被呼叫 |
PUT_MANY | put集合時被呼叫 |
DELETE_SINGLE | delete單個時被呼叫 |
DELETE_MANY | delete集合時被呼叫 |
跨域請求
-
-
pip install flask_cors
-
1 # run.py 2 from flask_cors import CORS 3 app = Flask(__name__) 4 CORS(app,supprts_credentials=True) 5 6 if __name__=="__main__": 7 app.run(host='',port=) 8 9 # restFulRun.py 10 import environment 11 environment.init("restful") 12 from app import app 13 from flask_restful import Api 14 from flask_cors import CORS 15 from app.Controllers.RestfulController import TodoList 16 17 api = Api(app) 18 api.add_resource(TodoList, '/todos') 19 app = app 20 CORS(app, supports_credentials=True) 21 if __name__ == '__main__': 22 app.debug = False 23 app.run(host='0.0.0.0', port=502)