Python--Flask 開發(fā)Android API接口

1. Flask介紹

Flask是一個(gè)使用 Python 編寫的輕量級(jí) Web 應(yīng)用框架哈恰,使用簡(jiǎn)單操作方便散罕,很適合開發(fā)輕量級(jí)的API接口蹭睡,讓Android程序員從此不再去問后臺(tái)要測(cè)試接口了车海。

2. 簡(jiǎn)單使用

1.安裝
pip3 install Falsk
2.使用

from flask import Flask

#初始化
app = Flask(__name__)

#路由
@app.route('/')
def gello_world():
    return 'Hello Flask'

if __name__ == '__main__':
    #開啟service
    app.run()

運(yùn)行這個(gè)python文件變啟動(dòng)了服務(wù)碧浊,默認(rèn)8080端口

3. 項(xiàng)目實(shí)戰(zhàn)

實(shí)戰(zhàn)目標(biāo):實(shí)現(xiàn)一個(gè)注冊(cè)登陸的接口砚尽,JSON格式

1.準(zhǔn)備數(shù)據(jù)庫(kù)相關(guān)

字段 長(zhǎng)度 說(shuō)明
id bigint 自增長(zhǎng)主鍵ID
user varchar 用戶名
psw varchar 用戶密碼
registerTime timestamp 注冊(cè)時(shí)間
phone varchar 手機(jī)號(hào)碼

2.db.py
數(shù)據(jù)庫(kù)使用的是sqlalchemy

# -*- coding:utf-8 -*-
from operator import or_
from sqlalchemy import create_engine, Table, MetaData
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, mapper
from sqlalchemy.pool import NullPool
import traceback
'''
解決中文亂碼
1.create_engine中添加charset=utf8,encoding='utf-8'
2.表中添加__table_args__ = {
        "mysql_charset": "utf8"
    }
'''
# 獲取實(shí)體數(shù)據(jù)庫(kù)連接
engine = create_engine('mysql+pymysql://root:1234@127.0.0.1:3306/python?charset=utf8',
                       encoding='utf-8',
                       echo=False,
                       poolclass=NullPool)

metadata = MetaData(engine)

# 反射全庫(kù) 開始
metadata.reflect(bind=engine)
print('獲取所有表名:', metadata.tables.keys())
# 反射全庫(kù) 結(jié)束

Base = automap_base()

Base.prepare(engine, reflect=True)
print('獲取所有對(duì)象名:', Base.classes.keys())

db_session = sessionmaker(bind=engine)

def login(user_name, user_psw):
    '''
    登陸
    :param user_name: 
    :param user_psw: 
    :return: 
    '''
    session = db_session()
    db_user = Base.classes.user
    try:
        user = session.query(db_user).filter(
            db_user.user == user_name,
            db_user.psw == user_psw).one()
        return user
    except BaseException:
        message = traceback.format_exc()
        if not message.__contains__('No row was found for one()'):
            #無(wú)此用戶信息
            print(message)
        session.close()
        return None

def register(user_name, user_psw, user_phone):
    '''
    注冊(cè)
    :param user_name: 
    :param user_psw: 
    :param user_phone: 
    :return: 
    '''
    session = db_session()
    db_user = Base.classes.user
    count = session.query(db_user).filter(
        or_(db_user.phone == user_phone,
            db_user.user == user_name)
    ).count()
    if int(count) > 0:
        return False
    user = db_user(user=user_name, psw=user_psw, phone=user_phone)
    session.add(user)
    session.commit()
    session.close()
    return True

3.servier.py

# 簡(jiǎn)單的flask接口服務(wù)

from flask import Flask, request, jsonify
import sys
import threading
import time

import db
from util import is_phone_num

server = Flask(__name__)

@server.route('/test/login', methods=['GET', 'POST'])
def login():
    print(threading.current_thread().name)
    username = request.values.get("username")
    psw = request.values.get('psw')
    if not username or not psw:
        return jsonify({'code': 400, 'msg': '參數(shù)缺省'})
    user = db2.login(username, psw)
    if user:
        res = {'code': 200, 'msg': '登錄成功', 'user': {
            'username': user.user,
            'phone': user.phone,
            'registerTime': str(user.registerTime)
        }}
    else:
        res = {'code': 400, 'msg': '賬號(hào)或密碼錯(cuò)誤'}
    return jsonify(res)

@server.route('/test/register', methods=['GET', 'POST'])
def register():
    username = request.values.get("username")
    psw = request.values.get('psw')
    phone = request.values.get('phone')
    if not username or not psw or not phone:
        return jsonify({'code': 400, 'msg': '參數(shù)缺省'})
    if not is_phone_num(phone):
        return jsonify({'code': 400, 'msg': '手機(jī)號(hào)非法'})
    success = db2.register(username, psw, phone)
    return jsonify(
        {'code': 200 if success else 400, 'msg': '尊敬的{},恭喜您注冊(cè)成功'.format(username) if success else '用戶信息已被注冊(cè)'})

if __name__ == '__main__':
    server.run(
        port=8889, #自定義端口
        debug=True,#是否開啟debug模式
        host='192.168.0.105',#指定host
        threaded=True#是否開啟多線程
    )

4.接口

◣
Path:
http://192.168.0.105:8889/test/register?username=TangRen&psw=m123456&phone=18600000000
{
    "code": 200,
    "msg": "尊敬的TangRen,恭喜您注冊(cè)成功"
}

◣
Path:
http://192.168.0.105:8889/test/login?username=TangRen&psw=m123456
{
    "code": 200,
    "msg": "登錄成功",
    "user": {
        "phone": "18600000000",
        "registerTime": "2019-06-24 22:11:46",
        "username": "TangRen"
    }
}

4. 總結(jié)

Python大法好

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辉词,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子猾骡,更是在濱河造成了極大的恐慌瑞躺,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兴想,死亡現(xiàn)場(chǎng)離奇詭異幢哨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)嫂便,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門捞镰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人毙替,你說(shuō)我怎么就攤上這事岸售。” “怎么了厂画?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵凸丸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我袱院,道長(zhǎng)屎慢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任忽洛,我火速辦了婚禮腻惠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘欲虚。我一直安慰自己集灌,他們只是感情好蹄殃,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布叶沛。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厚掷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天栈妆,我揣著相機(jī)與錄音扛吞,去河邊找鬼。 笑死酷鸦,一個(gè)胖子當(dāng)著我的面吹牛饰躲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播臼隔,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼嘹裂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了摔握?” 一聲冷哼從身側(cè)響起寄狼,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氨淌,沒想到半個(gè)月后泊愧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盛正,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年删咱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豪筝。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡痰滋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出续崖,到底是詐尸還是另有隱情敲街,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布严望,位于F島的核電站聪富,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏著蟹。R本人自食惡果不足惜墩蔓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萧豆。 院中可真熱鬧奸披,春花似錦、人聲如沸涮雷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至样刷,卻和暖如春仑扑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背置鼻。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工镇饮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人箕母。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓储藐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嘶是。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钙勃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    小邁克閱讀 2,963評(píng)論 1 3
  • FLASK框架 簡(jiǎn)介: flask是一個(gè)非常小的python web框架 只提供了一個(gè)強(qiáng)勁的核心 其它都...
    riverstation閱讀 2,020評(píng)論 2 38
  • 筆記 RESTful架構(gòu)風(fēng)格概述 RESTful架構(gòu)風(fēng)格 RESTful架構(gòu)風(fēng)格最初由Roy T. Fieldin...
    plutoese閱讀 12,581評(píng)論 3 58
  • 你是否為此煩惱辖源? 不催很多遍,孩子不會(huì)開始寫作業(yè) 開始寫了希太,一個(gè)小時(shí)同木,幾個(gè)字 睡覺時(shí)間到了,離不開電視屏幕 磨蹭常...
    團(tuán)的花園閱讀 200評(píng)論 0 0
  • 星星因向往太陽(yáng)而喪失光芒 露水因渴望光芒而消耗殆盡 像蠟燭燃燒自己 像飛蛾撲向火焰 白日的夢(mèng) 夜晚來(lái)湊
    文長(zhǎng)清閱讀 187評(píng)論 1 4