1. 程式人生 > 其它 >Java開發需要學習哪些內容?

Java開發需要學習哪些內容?

Flask

面向簡單需求和小型應用的框架

特點

  1. 內建開發伺服器和偵錯程式

  2. 與python的單元測試無縫連線

  3. 使用Jinja2模板(HTML模板)

  4. 完全相容WSGI

  5. 基於Unicode編碼

安裝

  1. pip install flask

  2. 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) #對字串做轉義處理,比如‘>’轉成&gt 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 %}

路由

  1. 路徑中新增變數:

    1. @app.route('/login/<username>')

    2. @app.route('/login/<int:number>') 此時number傳到方法的就是整型而不是字串

  2. 結尾都要加‘/’

  3. Http方法繫結

    1. @app.route('/sendMessage',method=['GET','POST'])

  4. 路由地址方向生成

     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

  1. 會話上下文

    1. 會話與使用者是一對一的關係

    2. 通過Cookie實現

      1. SessionID

    3. from flask import session

      1. session['xxx']=yyy

      2. session.get('xxx')

      3. session.new 判斷session是不是新建的

      4. session.moidified 判斷session是否被修改

  2. 應用全域性物件

  3. from flask import g

  4. 一般用來定義資料庫連線和斷開

  5. 請求上下文

    1. from flask import request

    2. 屬性名稱訪問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
    3. 屬性作用
      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資料解析失敗的回撥
  6. 回撥接入點

    1. @app.before_request:請求呼叫前處理

    2. @app.after_request:請求呼叫後處理

    3. @app.teardown_request:請求呼叫後強制處理

JinJa2

  1. {{}}:變數或表示式,{%%}:邏輯控制,{##}:註釋

  2. 過濾器

    過濾器描述
    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) 字串分析處理
  3. 流程控制

    1. 測試

      1. is

      2. 判斷描述
        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) 是否字串
    2. 判斷:{% if %}...{% elif %}...{else}...{%endif%}

    3. 迴圈:{% for %}...{% endfor %}

      1. 特殊變數

        變數描述
        loop.index 迭代的次數(從1開始)
        loop.index0 迭代的次數(從0開始)
        loop.revindex 到迭代結束的次數(從1開始)
        loop.revindex0 到迭代結束的次數(從0開始)
        loop.first 是否第一次迭代
        loop.last 是否最後一次迭代
        loop.length 迭代長度
        loop.cycle 在一串序列間取值的輔助函式

    4. 繼承

      1. {% extends "base.html" %}

      2. {% block xxx %}...{% endblock %}

SQLAlchemy

  1. 定義表

    1. from sqlalchemy.ext.declarative import declarative_base

      1. Base = declarative_base()

    2. 表類繼承Base類

      1. __tablename__=u'account' 表在資料庫中實際的名稱

    3. from sqlalchemy import Column,Integer,String

      1. id = Column(Integer,primary_key=True)

      2. user = Column(String(50),nullable=False)

  2. 定義資料庫連結

    1. from sqlalchemy import create_engine

    2. from sqlalchemy.orm import scoped_session,sessionmaker

    3. 建立連結

      1. engine = create_engine(db_connect_string,connect_args)

      2. db_connect_string格式:[database_type]://[user_name]:[password]@[domain]:[port]/[database]?[parameters]

        1. 例如:mysql:v_user:v_pass@localhost:3306/test_database?charset=utf8

    4. 建立會話型別

      1. SessionType = scoped_session(sessionmaker(bind=engine,expire_on_commit=False))

      2. 需要定義獲取會話型別方法

        1 def GetSession():
        2     return SessionType()
      3. session.commit()、session.rollback()、session.close()、session.commit()

      4. 定義自動進行事務處理的函式

         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() #退出時自動關閉,關閉時會自動提交
  3. 操作

    1. with session_scope as session:

    2. 查詢:session.query().filter() 有or_、and_,兩個都需要import,在filter中使用

      1. first()

      2. all()

      3. filter可以使用like

      4. in_

      5. is_,isnot

      6. 連線查詢join()

    3. 新增:session.add()

    4. 刪除:session.delete()

    5. 關係

      1. ForeignKey():外來鍵設定

      2. relationship("子表類名",backref="表名",cascade='all')

        1. save_update

        2. delete

        3. refresh-expire

        4. all

      3. 一對多:一張父表、一張子表

      4. 多對多:一張關係表(即父表)、多張子表

  4. 表單

    1. Form類

      1. from flask.ext.wtf import Form

    2. Field

      1. from wtforms import StringField,BooleanField,HIddenField,TextField,DateTimeField

    3. Validator

    4. 顯示錶單

      1. return render_template('xxx.html',form=form)

    5. 獲取表單資料

      1. form.validate():判斷資料是否合法

      2. form.xxx.data

REST

REST:表述性狀態傳遞

  1. 呼叫形式

    1. GET/resource:查詢集合

    2. GET/resource/ID:查詢個體

    3. POST/resource:新增個體或集合

    4. PUT/resource/ID:全量修改個體

    5. PATCH/resource/ID:部分修改個體

    6. DELETE/resource/ID:刪除個體

Restless外掛

  1. 例項化管理者物件

    1 import flask_restless
    2 # 例項管理這物件,關聯應用和資料庫物件
    3 manager = flask_restless.APIManager(app,flask_sqlalchemy_db=db)
  2. 建立Restful介面

    manager.create_api(XXX,methods=['GET','POST','DELETE'])
  3. 定製介面(以下都是create_api的引數)

    1. url_prefix:定義介面的UIRL字首

    2. allow_patch_many:是否允許patch

    3. allow_delete_many:是否允許delete

    4. include_colums:定義需要在介面可見的屬性

    5. exclude_columns:和include_columns相反

    6. preprocessors:介面呼叫前呼叫函式

      manager.create_api(XXX,preprocessors={'POST'=[foo],'GET_SINGLE'=[trace_log]})
      # []中的是方法名
    7. 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集合時被呼叫

跨域請求

  1. 跨域請求原理: 在 HTML 中,<a>, <form>, <img>, <script>, <iframe>, <link> 等標籤以及 Ajax 都可以指向一個資源地址,而所謂的跨域請求就是指:當前發起請求的域與該請求指向的資源所在的域不一樣。這裡的域指的是這樣的一個概念:我們認為若協議 + 域名 + 埠號均相同,那麼就是同域。

    舉個例子:假如一個域名為a.com的網站,它發起一個資源路徑為a.com/addUser的 Ajax 請求,那麼這個請求是同域的,因為資源路徑的協議、域名以及埠號與當前域一致(例子中協議名預設為http,埠號預設為80)。但是,如果發起一個資源路徑為b.cn/addUser`的 Ajax 請求,那麼這個請求就是跨域請求,因為域不一致,與此同時由於安全問題,這種請求會受到同源策略限制

  2. pip install flask_cors

  3.  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)