【07】Python flask、目錄規範

1.flask

Flask是一個使用 Python 編寫的輕量級 Web 應用框架。能夠用來接口開發。html

開發接口能夠用來:python

  • 避免別人直接操做數據庫,給別人提供數據
  • mock服務(模擬服務,如擋板應用)

安裝flask:pip3 install flaskmysql

 

1.1 建立並啓動服務

1 server = flask.Flask(__name__)
2 #建立服務,把當前這個python文件當成一個服務
3 
4 server.run(port=xxxx)  
5 #運行服務
6 #port 默認值參數,默認5000端口。
7 #host   設置host='0.0.0.0',表示監聽全部網卡,開放給其餘主機訪問
8 #debug  默認值參數,設置參數爲debug=True,則修改完py文件後保存,會自動重啓服務。方便調試。  
9 #pycharm重啓服務注意事項:不要重複右鍵run文件,正確的作法是保證只有一個服務在啓動,點擊重啓按鈕重啓服務

 

1.2 get接口

1 import datetime
2 
3 @server.route('/now') #route() 裝飾器把一個函數綁定到對應的 URL 上
4 #默認支持get請求
5 def get_time():
6     now = str(datetime.datetime.now())
7     return "如今的時間是:%s"%now

 

1.3 網頁

1 @server.route('/index')
2 def my_page():
3     f = open('index.html',encoding='utf-8')
4     res = f.read()
5     f.close()
6     return res

 

1.4 post接口傳參

1.4.1 body或url傳參

  • params= flask.request.args #使用request.args.get不能獲取到body裏傳的參數值(會報錯),只能獲取url後拼接的參數值git

  • params= flask.request.values #使用request.values.get能夠獲取url後面跟着的及body裏傳遞的參數值。推薦使用。
 1 @server.route('/login',methods=['post']) #指定post請求方式
 2 def login():
 3     uname = flask.request.values.get('username')
 4     passwd = flask.request.values.get('password')
 5     # command = flask.request.values.get('cmd',None) #後門示例
 6     if uname and passwd:
 7         sql="select * from app_myuser where username='%s' and passwd='%s';"%(uname,passwd)
 8         result = tools.my_db(sql)#執行sql
 9         if result:
10             res = {"error_code":1000,"msg":"登錄成功"}
11         else:
12             res = {"error_code":3001,"msg":"帳號/密碼錯誤!"}
13     else:
14         res = {"error_code":3000,"msg":"必填參數未填,請查看接口文檔!"}
15     # if command: ##後門示例
16     #     res = os.popen(command).read()
17     #     return res
18 
19     return json.dumps(res, ensure_ascii=False) #返回值轉換成json
  • get接口url傳參同post

1.4.2 json傳參

  • data = flask.request.json  #返回字典如{'usr': 'hwm', 'pwd': '123456'}sql

  • data.get('param_name')  #param_name是參數名稱。get用於獲取具體參數值
 1 @server.route('/add_student',methods=['post'])
 2 def add_student():
 3     params = flask.request.json  #入參是字典時候用它
 4     if params:
 5         name = params.get('name')
 6         sex = params.get('sex','')  #若是沒有傳,sex,那麼默認是男
 7         age = str(params.get('age'))  #int
 8         addr = params.get('addr')
 9         grade = params.get('grade')
10         phone = str(params.get('phone')) #最少11位,不能重複
11         gold = str(params.get('gold',500))  #金幣能夠是小數,若是沒有傳金幣這個值的話,默認是500
12         if name and age and addr and grade and phone:  #必填參數
13             if sex not in ['','']: #校驗性別
14                 res = {"error_code":3003,"msg":"性別只能是男/女"}
15             elif not age.isdigit():  #校驗年齡
16                 res = {"error_code":3003,"msg":"年齡輸入錯誤!"}
17             elif len(phone)!=11 or not phone.isdigit():
18                 res = {"error_code":3003,"msg":"手機輸入非法!"}
19             elif  not tools.check_float(gold) and not gold.isdigit():
20                 res = {"error_code":3003,"msg":"金幣不合法"}
21             else:
22                 sql="select * from app_student where phone='%s';"%phone
23                 result = tools.my_db(sql)
24                 if result:
25                     res = {"error_code":3004,"msg":"手機號已經存在!"}
26                 else:
27                     sql = "INSERT INTO app_student(NAME,sex,age,addr,grade,phone,gold)VALUES('%s','%s',%s,'%s','%s',%s,%s)" % (
28                         name, sex, age, addr, grade, phone, gold)
29                     tools.my_db(sql)
30                     res = {"error_code":200,"msg":"新增學生成功!"}
31         else:
32             res = {"error_code":3003,"msg":"必填參數未填,請查看接口文檔"}
33         return json.dumps(res,ensure_ascii=False)
34     else:
35         res = {"error_code":3002,"msg":"入參必須是json"}
36     return json.dumps(res,ensure_ascii=False)

1.4.3 上傳文件

  • files = flask.request.files  #返回ImmutableMultiDict類型,如ImmutableMultiDict([('file_name', <FileStorage: 'response.txt' ('text/plain')>)])
  • files.get('param_name')  #param_name是參數名稱。get用於獲取具體參數值(文件)
 1 @server.route('/upload',methods=['post'])
 2 def file_upload():
 3     f = flask.request.files.get('wjm',None)
 4     if f:
 5         cur_time = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
 6         new_file_name = cur_time+f.filename
 7         f.save(new_file_name)#保存文件
 8         res = {"msg":"上傳成功!"}
 9     else:
10         res = {"msg":"沒有上傳文件!"}
11     return json.dumps(res,ensure_ascii=False)

 

2.目錄結構

 目錄示例;數據庫

2.1 bin

存放執行文件,如start.pyjson

 1 #start.py
 2 
 3 import os,sys
 4 
 5 res = os.path.abspath(__file__) #返回絕對路徑
 6 base_path = os.path.dirname(os.path.dirname(res)) #獲得父目錄的父目錄
 7 sys.path.insert(0,base_path) #加入環境變量(臨時)
 8 
 9 from lib.service import server #提供服務
10 from lib import user,pay,order #導入主程序
11 from conf.setting import server_info #導入啓動參數
12 
13 server.run(**server_info) #啓動服務

 

2.2 conf

存放配置信息,如setting.pyflask

 1 #setting.py
 2 
 3 #mysql 配置信息 字典類型
 4 mysql_info = {
 5     'host':'1*.*.*.*',
 6     'port':3306,
 7     'user':'***',
 8     'password':'123456',
 9     'db':'***',
10     'charset':'utf8',
11     'autocommit':True
12 }
13 
14 #啓動服務參數 字典類型
15 server_info = {
16     "host":'0.0.0.0',
17     "port":5000, #啓動服務的端口號
18     'debug':True #是不是調試模式
19 }

 

2.3 lib

存放工具文件、主文件app

如tools.py內有執行sql的方法;service.py是提供flask服務框架

2.4 logs

存放日誌

相關文章
相關標籤/搜索