flask開發restful api系列(3)

来源:http://www.cnblogs.com/yueerwanwan0204/archive/2016/03/31/5330201.html
-Advertisement-
Play Games

上面兩章,主要講基本的配置,今天我們來做一個比較有趣的東西,為每個客戶加一個頭像圖片。如果我們圖片保存在自己的伺服器,對於伺服器要求有點高,每次下載的時候,都會阻塞網路介面,要是1000個人同時訪問這張圖片,會徹底報廢掉整個網路。如果你跟我一樣,在小公司,沒有自己專業的圖片伺服器,又想用圖片,那就跟 ...


  上面兩章,主要講基本的配置,今天我們來做一個比較有趣的東西,為每個客戶加一個頭像圖片。如果我們圖片保存在自己的伺服器,對於伺服器要求有點高,每次下載的時候,都會阻塞網路介面,要是1000個人同時訪問這張圖片,會徹底報廢掉整個網路。如果你跟我一樣,在小公司,沒有自己專業的圖片伺服器,又想用圖片,那就跟我一樣,嘗試著用七牛吧。這個真的是一款很不錯雲產品。

  首先,在model裡加一個欄位,

 1 # coding:utf-8
 2 from sqlalchemy import create_engine, ForeignKey, Column, Integer, String, Text, DateTime,\
 3     and_, or_, SmallInteger, Float, DECIMAL, desc, asc, Table, join, event
 4 from sqlalchemy.orm import relationship, backref, sessionmaker, scoped_session, aliased, mapper
 5 from sqlalchemy.ext.declarative import declarative_base
 6 from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method
 7 from sqlalchemy.orm.collections import attribute_mapped_collection
 8 import datetime
 9 
10 engine = create_engine("mysql://root:[email protected]:3306/blog01?charset=utf8", pool_recycle=7200)
11 
12 Base = declarative_base()
13 
14 db_session = scoped_session(sessionmaker(autocommit=False,
15                                          autoflush=False,
16                                          bind=engine))
17 
18 Base.query = db_session.query_property()
19 
20 
21 class User(Base):
22     __tablename__ = 'user'
23 
24     id = Column('id', Integer, primary_key=True)
25     phone_number = Column('phone_number', String(11), index=True)
26     password = Column('password', String(30))
27     nickname = Column('nickname', String(30), index=True, nullable=True)
28     head_picture = Column('head_picture', String(100), default='')
29     register_time = Column('register_time', DateTime, index=True, default=datetime.datetime.now)
30 
31 
32 if __name__ == '__main__':
33     Base.metadata.create_all(engine)

增加好了以後,開始整合資料庫。該怎麼弄呢?flask建議我們,可以使用第三方插件,flask-migrate,其他它的底層就是用的alembic,既然我們知道,就可以直接用alembic。為什麼直接用alembic呢?相信大家也看出來了,我這的代碼跟其他的flask用sqlalchemy不一樣,很多人都直接用flask-sqlalchemy插件,但我不太喜歡。因為這個會束縛著我,為什麼要用flask,就是因為它自由,想怎麼改就怎麼改,以後要是在這個目錄下,寫點腳本,直接引用即可,沒有必要一定要在current_app環境下。這個只是個人喜好,喜歡用flask-sqlalchemy的可以繼續使用。

 

首先安裝alembic,由於之前安裝過flask-migrate,所以直接使用apt-get install alembic就可以了。

先在blog01目錄下,

alembic init my_migration

這時候,會生成my_migration目錄,這時候目錄如下:

 這時候編輯一下alembic.ini,這是alembic的配置文件,基本只要修改一處就可以了。

sqlalchemy.url = mysql://root:[email protected]:3306/blog01?charset=utf8

其實就是告訴alembic,我每次修改的時候,你去動哪個資料庫

接下來就是程式,alembic的腳本是放在env.py裡面,其實也只是要修改一處,就是告訴alembic,我對應的orm用的是哪個引擎。

按照正常情況下,我們只要加兩行代碼就夠了,按照理想狀況應該是這樣

from model import Base
target_metadata = Base.metadata

如果我們僅僅是這樣,會出現導入錯誤,找不到包,它不知道你要怎麼引用包,所以我們要把當前目錄加入到環境變數中,使之全局可用。

可是還是導入包錯誤,一定要把頂部的blog01也放在包裡面,代價太大,不如按照標準方式,把所有文件放在app中。

import os
import sys
root = os.path.dirname(__file__) + '/..'
sys.path.append(root)

from model import Base
target_metadata = Base.metadata

然後結構變成這樣。


運行終端,定位到blog01目錄下,

>>alembic revision --autogenerate -m 'add column head_picture'
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.autogenerate.compare] Detected added column 'user.head_picture'
  Generating /home/yudahai/PycharmProjects/blog01/my_migration/versions/9a12387b186_add_column_head_picture.py ... done

生成編輯腳本,

再運行

>>alembic upgrade head

就可以了,去資料庫看看吧,已經多了一個頭像列了。

這邊要多說一下,alembic可以增加,刪除列,但對改變列有的不自動支持,需要自己稍微修改一下。下麵我做一個試驗,把head_picture從String(100)修改到String(120),首先我們檢查一下資料庫實際情況。

mysql> show create table user;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `phone_number` varchar(11) DEFAULT NULL,
  `password` varchar(30) DEFAULT NULL,
  `nickname` varchar(30) DEFAULT NULL,
  `register_time` datetime DEFAULT NULL,
  `head_picture` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `ix_user_nickname` (`nickname`),
  KEY `ix_user_phone_number` (`phone_number`),
  KEY `ix_user_register_time` (`register_time`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> 

看上面的代碼,head_picture是String(100),如果我們按照傳統的辦法,alembic是沒法修改欄位的,官方文檔也介紹了,截取欄位類型和修改欄位名字,需要自己手寫腳本。不要擔心,其實非常非常簡單。

首先,還是把model.py裡面的head_picture修改為120

    head_picture = Column('head_picture', String(120), default='')

然後生成腳本

$ alembic revision --autogenerate -m 'alter column head_picture string120'

會生成這個腳本文件,打開它,看代碼

def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    pass
    ### end Alembic commands ###


def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    pass
    ### end Alembic commands ###

它什麼都沒寫,這要我們自己寫的,也非常非常容易。代碼如下。

from sqlalchemy.dialects import mysql

def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.alter_column('user',  'head_picture', sa.String(length=120), existing_type=mysql.VARCHAR(120))
    ### end Alembic commands ###


def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.alter_column('user',  'head_picture', sa.String(length=100), existing_type=mysql.VARCHAR(100))
    ### end Alembic commands ###

看見沒有,如果對mysql稍微熟悉一點,都知道什麼意思,就是直接把varchar(100)換成varchar(120),如果以後降級,再換成varchar(100)。是不是非常簡單,好了,執行這個腳本吧。

$ alembic upgrade head

檢查一下效果

mysql> show create table user;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `phone_number` varchar(11) DEFAULT NULL,
  `password` varchar(30) DEFAULT NULL,
  `nickname` varchar(30) DEFAULT NULL,
  `register_time` datetime DEFAULT NULL,
  `head_picture` varchar(120) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `ix_user_nickname` (`nickname`),
  KEY `ix_user_phone_number` (`phone_number`),
  KEY `ix_user_register_time` (`register_time`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

看head_picture是不是變成120了,是不是很簡單?好了,這一章就介紹到這,下一章,我們介紹如何通過七牛上傳圖片。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Hello! 歡迎新老朋友來到這裡,這裡隨時恭候你的大駕。 接下來說說三層架構↓↓↓↓↓↓ 三層架構分為:表現層(UI(User Interface))、業務邏輯層(BLL(Business Logic Layer))、數據訪問層(DAL(Data Access Layer))再加上實體類庫(Mod ...
  • 1、解析簡單Json字元串 2、從Json字元串中解析Json數組 持續更新中,敬請期待... ...
  • 日常開發的絕大多數系統中,都涉及到管理用戶的登錄和授權問題。登錄功能(Authentication),針對於所有用戶都開放;而授權(Authorization),則對於某種用戶角色才開放。 在asp.net mvc中,微軟雖然已經幫助開發者構建了ASP.NET Identity這樣強大的驗證授權框架 ...
  • 一、開發環境 操作系統:Win10 編譯器:VS2013 .Net版本:.net framework4.5 二、涉及程式集 Spring.Core.dll:1.3.1 Common.Logging.dll 三、開發過程 1.項目結構 2.編寫Product.cs namespace SpringNe... ...
  • 作者:[美]Adam Freeman 來源:《精通ASP.NET MVC 4》 前面建立的都是簡單的MVC程式,現在到了吧所有事情綜合在一起,以建立一個簡單但真實的電子商務應用程式的時候了。 在此打算建立的應用程式 — SportsStore (體育用品商店),將遵循隨處可見的線上商店所採取的經典方 ...
  • 1、讀取網路中html網頁內容,獲取網頁中元素body內的html,處理所有img元素的src屬性後以字元串返回 2、通過HtmlAgilityPack Html操作類庫將html格式的字元串載入為html文檔對象,再對html dom進行操作 持續更新中,敬請期待... ...
  • SqlHelper類 作用:充當一個助人為樂的角色。這個類呢,任何類都可以調用。例如:數據的“增, 刪, 改 ,查”,資料庫的鏈接,等等。 這個類是靜態類,只要用類名.方法名(),就可以使用該方法的功能了。 作用:簡化代碼,提高性能,提高運行效率。 string sql = "select * fr ...
  • 不做開篇廢話,我們發現: AdaptiveTrigger 不夠好 我們知道,UWP可以在一個頁面適應不同尺寸比例的屏幕。一般來說這個功能是通過官方推薦的AdaptiveTrigger 進行的。 比如這樣: 我們可以看到這樣的的Trigger制定了最小值,隱含了條件“當滿足長寬都大於於這個條件時,這個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...