Controller是對URL endpoint處理,我們這裡以兩支API來做範例:
import json
from odoo import _
from odoo.http import Controller, Response, request, route, JsonRequest
from odoo.tools import date_utils
class StudtentController(Controller):
@route('/student/all', methods=['GET'], type='http', auth='public', cors='*', csrf=False)
def get_student_list(self):
data = []
students = request.env['res.student'].sudo().search([])
for student in students:
val = {
'id': student.id,
'name': student.name,
'nickname': student.nickname,
'gender': student.gender
}
data.append(val)
result = {'data': data}
body = json.dumps(result, default=date_utils.json_default)
return Response(
body, status=200,
headers=[('Content-Type', 'application/json'), ('Content-Length', len(body))]
)
@route('/student', methods=['POST'], type='json', auth='public', cors='*', csrf=False)
def create_student(self):
student_data = json.loads(request.httprequest.data)
val = {
'name': student_data.get('name'),
'nickname': student_data.get('nickname'),
'gender': student_data.get('gender'),
'birthday': student_data.get('birthday')
}
student_obj = request.env['res.student'].sudo()
student_obj.create(val)
result = {'code': 200, 'message': 'Created Successfully'}
body = json.dumps(result, default=date_utils.json_default)
return Response(
body, status=200,
headers=[('Content-Type', 'application/json'), ('Content-Length', len(body))]
)
@route
裝飾器代表端點以及相關參數設定
第一個參數代表指定的endpoint,所以request url 就是 http://domain/student
methods:代表requests method,這裡是陣列也可以寫入多個requests method,透過ODOO內的request.httprequest.method
分辨後再做想要做的事,以第一隻API為例我們只限定於GET method。
type: 只有json
和http
兩種,差別在於content type是不是application/json,來限制使用者請求,若不符規定則會返回錯誤。
auth: 有user
、public
、none
三種,user
限定需要使用者在登入狀態,常用在頁面引導,而這邊使用的API則是不需要經由登入認證故寫為public
,
cors: 開通跨域的參數
crsf: 預設為True
,也就是crsf token認證,這邊我們用API寫法時要改為False
我們第一隻API用來查詢學生資料,透過request.env['res.student']
,尋找此model底下資料,因為我們在search內沒有加上domain所以會找出所有資料,另外我們可以控制return給使用者的參數,這裡只給id、名字、綽號、性別,性別是會給當初設定的Key值,最後要注意的是,返回的值必須為JSON Object。
HTTP method: GET
URL endpoint: /student/all
Response:
{
"data": [
{
"id": 23,
"name": "林小美",
"nickname": "美美",
"gender": "female"
},
{
"id": 22,
"name": "王大明",
"nickname": false,
"gender": "male"
},
{
"id": 27,
"name": "陳大熊",
"nickname": "熊",
"gender": "male"
}
]
}
有前面的例子就很簡單了,因我們之前設定birthday
欄位為required
,所以新增的時候必須帶入,我們透過create method,ODOO便會根據欄位新增。
HTTP method: POST
URL endpoint: /student
Request body:
{
"name": "黃小華",
"nickname": "阿華",
"gender": "male",
"birthday": "2020-02-01"
}
Response:
{
"jsonrpc": "2.0",
"id": null,
"result": "<Response 48 bytes [200 OK]>"
}
Result:
Controller的介紹就到這了,明天我們來介紹Security