---
# System prepended metadata

title: Python主控端程式筆記
tags: [Development, Study]

---

# Python主控端程式筆記
###### tags: `Development`,`Study`
## 目錄

[ToC]

## Flask
1. <https://blog.techbridge.cc/2017/06/03/python-web-flask101-tutorial-introduction-and-environment-setup/>
2. <https://zwindr.blogspot.com/2018/03/python-flask.html>
3. https://hackmd.io/@shaoeChen/SyP4YEnef?type=view
4. https://medium.com/@twilightlau94/rest-apis-with-flask-%E7%B3%BB%E5%88%97%E6%95%99%E5%AD%B8%E6%96%87-1-5405216d3166
5. https://www.itread01.com/content/1546450059.html (upload file)
6. https://medium.com/datainpoint/flask-web-api-quickstart-3b13d96cccc2

* __Server__
  * Library
    ```python
    from flask import Flask, request, ...(any lib needed)
    from config import DevConfig # 自訂的config.py, 內含已定義之config_object
    ```
  * Construction
    ```python
    app = Flask(__name__)
    ```
  * Configuration
  
    ```python
    app.config[attributes] = values
    ```
    or
    ```python
    app.config.from_object(DevConfig)
    ```
    to load attributes from self defined object (class).
    
    All configuration attributes: <https://flask.palletsprojects.com/en/0.12.x/config/>
  
  * Adding route and func
    ```
    @app.route(url, methods)
    def func():
        ~
    ```
    url: where to access func( ).
    methods: how clients request to server. ('GET', 'POST' or both, default is 'GET')
    
* __Client__
  <https://requests.kennethreitz.org/en/master/api/>
  ```python
  import requests # making HTTP requests

  r = requests.get(url)
  r2 = requests.post(url, data=your_data, files=your_file)
  # .get to ask for response
  # .post to send value (and get response of needed)
  # .~(url, data=, )
  
  ```
  Note that data and files are passed in dict form.
* __Communication__
  
  [Flask](http://flask.palletsprojects.com/en/1.1.x/#api-reference) is built up with [Jinja](https://jinja.palletsprojects.com/en/2.10.x/) template engine and the [Werkzeug](https://www.palletsprojects.com/p/werkzeug/) WSGI toolkit. Thus, the messages passing between server and client must obey the [WSGI](https://wsgi.readthedocs.io/en/latest/learn.html) specification. 
  + Client
    Client would send request to server and get the response if needed. We used [requests](https://requests.kennethreitz.org/en/master/api/) tookit to send requests obeying the HTTP protocal. There are two methods of requests: GET and POST.
    ```python
    import requests
    
    url = 'http://127.0.0.1:5000'
    r1 = resquests.get(url)
    data = {'data': 'user_info',
            'user': 'c95cc',
            'password': '123456'}
    file = {'file': [1,2,3,4,5,6]}
    r2 = requests(url, data=data, files=file)
    print(r1.text)
    print(r2.status)
    print(r2.json)
    ...
    ```
    
  + Server
    ```python
    app = Flask()
    # assigning your server configuration
    # ...
    # end of assignment
    @app.route(url='/', methods=METHODS) # url can be modified if needed
    def _func(): # The action when this url is activated
        msg = request.json
        if msg['user'] == 'c95cc'and msg[passward] == '123456':
            return 'Legal user' # in response.txt
        else:
            return {'error':'self defined message'} # in response.json
    ```
    * METHODS can be 'GET', 'POST' or ['GET', 'POST']
    
## Encoding and Decoding Image

The request/response messages is transmitted as stream, thes the encoding/decoding procedure before request/after response is needed.

Flask/requests api can transmit json format directly, whie the elements in the json should be encoded and decoded before the transition. 


+ Encoding
  uint8 image -> byte image -> byte string -> b64 format -> utf-8 format
  ```python
  def b64_encode(img):
    byte_str = cv2.imencode('.png', img)[1].tostring()
    b64_str = base64.b64encode(byte_img).decode('utf-8')
    return b64_str
  ```

+ Decoding
  utf-8 format -> byte string -> np array -> uint8 image
  ```python
  def b64_decode(b64_str):
    byte_str = base64.b64decode(b64_str)
    np_img = np.fromstring(byte_str, np.uint8)
    img = cv2.imdecode(np_img, cv2.IMREAD_COLOR)
    return img
  ```