
node.js + express + docker + mysql + jwt 實現用戶管理restful api
既然說到用法,那第一個就肯定得說說它是怎么啟動的,不然別人哪里還學的下去啊,廢話少說,開干。
from flask import Flask
app=Flask(__name__) #創建應用實例
@app.route('/') # route裝飾器創建路由
def hello(): # 訪問此路由時執行的視圖函數
return 'hello' # 視圖函數的返回值,又叫‘響應’
if __name__ == '__main__':
app.run(debug=True) #開始運行flask應用程序,以調試模式運行
#可以設置啟動的host地址和端口號,具體方法:
app.run(host='192.168.1.2',port=3243)
從上面可以看出,因為我修改了視圖函數和返回值,只需在瀏覽器刷新即可,完全不用退出重啟,sublime text 3真是神器啊,給力,墻裂建議大家使用。
要想創建一個Flask應用,首先我們要建立一個項目文件夾,里面至少要有兩個文件夾,一個存放媒體文件(static),一個存放網頁文件(templates),如果Python程序不多,可以不用給它單獨建立文件夾。Flask不像Django一樣可以自動創建文件夾,需要我們自己創建。如果你想查看flask創建的路由信息:
url_map存儲的是url與endpoint的映射。那么這個endpoint是什么意思了?實際上,當請求傳來一個url的時候,會先通過rule找到endpoint,然后再根據endpoint再找到對應的視圖函數。通常,endpoint的名字都和視圖函數名一樣。這里還有一點特別注意,那就是所有的控制臺輸出信息語句必須寫在app.run()之前,否則不起作用。
我們可以看到Flask里面有一個name,這個是為了啟動模板專門設立的,除了這個,它還有:
static_url_path:靜態網頁地址
static_folder:靜態地址,默認為static文件夾
template_folder:模板文件夾,默認為templates文件夾
比如以調試模式運行Flask應用就可以使用:app.run(debug=True)
app.config=True
在項目文件夾根目錄建立一個配置文件夾,名字為 hw.hw,后綴名你隨便取,內容為 DEBUG=True,然后在app.run()前面添加app.config.from_pyfile(‘hw.hw’) 即可。
@app.route('/index')
def index():
return 'index'
2)轉換器
@app.route('/index/<int:num>') #定義轉換器名字num
def num(num): #將轉換器傳入函數中
if num>10: #如果它的值大于10輸出dog,小于10輸出pig
return 'dog'
else:
return 'pig'
這里需要說到的是,轉換器主要是將頁面后的值作為某一個標準來得到另一個頁面,我們??吹降募用茏址褪怯眠@個做的,那么它有哪些類型呢?
Flask的默認轉換器:DEFAULT_CONVERTERS = {
‘default’: UnicodeConverter,
‘string’: UnicodeConverter,
‘any’: AnyConverter,
‘path’: PathConverter,
‘int’: IntegerConverter,
‘float’: FloatConverter,
‘uuid’: UUIDConverter,}
除此之外,我們也可以自定一轉換器,定義轉換器需要使用依賴包,方法如下:
class rc(BaseConverter):
# 重寫父類的屬性,定義轉換器規則
def __init__(self,url_map):
super(rc,self).__init__(url_map)
#驗證QQ郵箱的正則表達式
self.regex ='[0-9a-zA-Z_]{0,19}@qq.com'
#定義視圖函數下的返回值
def to_python(self,value):
val=value
return val
def to_url(self,value):#返回url
return value
app.url_map.converters['em'] = rc #將自定義的轉換器添加到轉換器列表中
@app.route('/emm/<em:email>') #加入新的轉換器
def email(email):
return 'email is:%s' % email #返回email
可以通過反向解析將添加了自定義轉換器的視圖函數拿來用,這里需要用到重定向和反向解析:
@app.route('/search')
def jj():
url=url_for('email',email='2091500484@qq.com')
return redirect(url)
如果不注明轉換器類型,就是默認的字符串型:
@app.route('/hw/<boy>')
def hw(boy):
return 'boy:%s'%boy
還可以定義默認的轉換器的默認值:
@app.route('/ha/<string:haid>',defaults={'haid':'hello,boy'}) #設置默認值
def ha(haid):
return 'haid:%s'%haid
3)多個路由指向同一地址
@app.route('/1')
@app.route('/2')
def fg():
return '1122'
這里訪問下級頁面1或者頁面2都會得出同樣的結果’1122‘
重定向即是指從一個網頁跳轉到另一個網頁,相當于刷新之后的操作,這里涉及到flask里的兩個模塊(redirect,url_for)。
直接跳轉到路由下
from flask import redirect,url_for
@app.route('/refer')
def refer():
return redirect('/1')
這樣就可以直接跳轉到路由函數fg中并顯示返回值。
我們可以先訪問路由函數,然后跳轉到相應內容頁面
@app.route('/ref')
def ref():
return redirect(url_for('fg')) #跳轉
這樣直接訪問ref子頁面就可以直接跳轉到相應頁面了
有兩種方式,一是使用系統的abort直接賦值,二是使用自定義errorhandler函數。
直接使用系統自帶的錯誤內容
@app.route('/use/<id>')
def get_use(id):
if int(id)<10:
abort(404)
elif int(id)>20:
return '---Error---'
return 'hello:%s'%str(id)
自定義錯誤頁面內容
@app.errorhandler(404)
def error(err):
return 'hello,%s'%err
它可以將自定義的錯誤寫入到頁面中,平時會用的比較多。
@app.route('/error1')
def err1():
error1=('index error',666,[('key','div'),('value','zero')])
return error1
當然還有一種表述方式:
@app.route('/error2')
def err2():
error2=('login error',444,{'serise':'100','dataframe':'200'})
return error2
這里需要說到一個新的模塊make_response(),當然你也可以使用Response()。
@app.route('/error3')
def err3():
resp=make_response('search error') #這里只需把make_response()換成Response()即可
resp.status='400'
resp.headers['hrr']='zjj'
resp.headers['hw']='zj'
return resp
flask中有個非常給力的可以處理json數據的模塊,jsonify。
@app.route('/json1')
def json1():
data={'name':'HW','first':'ZJ'}
return jsonify(data)
@app.route('/json2')
def json2():
return jsonify(hour=12,second=21)
#cookie的設置
#set_cookie(key, value='', max_age=None, expires=None,path='/', domain=None, secure=False, httponly=False,samesite=None)
#key:鍵
#value:值
#max_age:設置過期時間(秒)
#expires:設置過期時間,時間戳的形式(1970離現在的時間)
#path:當前主域名
#domain:子域名
#設置cookie和headers
@app.route('/set_cookie')
def set_cookie():
response=make_response('cookie設置成功')
#cookie有效時長30天也可以是hour second minute
time=datetime.datetime.today()+datetime.timedelta(days=30)#設置cookie的有效時長
response.set_cookie('user','admin',expires=time) #設置用戶名的cookie
response.set_cookie('pass','123456',expires=time) #設置密碼的cookie
response.headers['X-Something']='mything' #這里不允許出現中文
response.headers['Server']='Linux' #服務器名稱
return response
這里需要用到一個模塊request,它相當于模擬一個請求,你可以把它當做requests模塊一樣。
@app.route('/get_cookie')
def get_cookie():
name="用戶名:"+request.cookies.get('user')+"密碼:"+request.cookies.get('pass')
return name
有兩種刪除方式來刪除cookie。
1.通過設置cookie過期時間為0即可刪除
@app.route('/del_cookie1')
def del_cookie1():
response=make_response('delete cookie 1')
response.set_cookie('user','',expires=0)
response.set_cookie('pass','',expires=0)
return response
2.直接刪除cookie
@app.route('/del_cookie2')
def del_cookie2():
response=make_response('delete cookie 2')
response.delete_cookie('user')
response.delete_cookie('pass')
return response
session里面保留的就是會話內容,它存在于cookie當中,通過它我們可以直接登陸某些已經登陸過的系統。要想操作session我們需要引入為它專門準備的session模塊,還有需要配置安全秘鑰才可以使用session。
app.config['SECRET_KEY']=os.urandom(30)
session['user']='hw'
session['pass']='zj'
session.parmanent=True #默認31天后過期
#session兩個小時過期
app.config['PERMANENT_SESSION_LIFETIME']= timedelta(hour=2)
四、綜合代碼
@app.route('/session1')
def session1():
session['user']='hw'
session['pass']='zj'
session.parmanent=True #默認31天后過期
return 'login success'
可以看到session成功設置在cookie里面了,并且瀏覽器也記錄了。當然你也可以只設置cookie,不過為了安全建議你設置session。
跟cookie獲取有點不同。
@app.route('/session2')
def session2():
us=session.get("user")
pa=session.get("pass")
return 'hello %s %s'%(us,pa)
這種方式如果獲取不到值容易產生異常,建議用上一種方法,除非你知道一定能獲取到值。
@app.route('/session2')
def session2():
us=session["user"]
pa=session["pass"]
return 'hello %s %s'%(us,pa)
也有兩種方法,不過一種是一個一個刪除,另一種則是全部刪除。
@app.route('/session3')
def session3():
session.pop('user',None)
session.pop('pass',None)
return 'delete successful!!!!'
二、全部刪除
@app.route('/session4')
def session4():
session.clear()
return 'delete successful!!!!'
本文著重講解了Flask的最基礎的用法,Flask是一個十分優秀的web開發框架,它可以十分迅速的開發出web應用,但是它需要依賴眾多的包才能完善更多的功能。這里只是講述了Flask一半的知識,下一篇文章,繼續給大家盤點,一起學習,共同進步!
今天來給大家說一個Python的輕量級web開發框架——-Flask,為什么要推薦它呢?當然是因為它夠輕量級了,開發迅速是它的特點,當然它也有缺點,不過這里不說,因為既用它又說它差感覺不好。上篇文章我們說了一半的內容,盤點Python網頁開發輕量級框架Flask知識(上篇),這篇文章繼續補全剩下的一半內容,一起來學習下吧~
這是一個專門用來操作網頁請求的模塊,今天我們圍繞這個來具體講解。
它是request中的請求方法,一般我們用的比較多的便是get和post,由于get 和post需要配合表單一起使用,在這里我們暫時不講前端的內容,只做簡單的演示。
可通過設置它的methods參數來指定請求方式。
@app.route('/get', methods = ['GET','POST'])
def get():
if request.method == 'GET':
return '這是一個GET請求'
else:
return '這是一個其它請求'
@app.route('/post', methods = ['POST','GET'])
def post():
if request.method == 'POST':
return '這是一個POST請求'
else:
return '這是一個其它請求'
記錄get請求中的查詢參數,一般用于查詢,搜索網址
https://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord=不謂俠
它會返回get請求中的參數,比如請求上面的url,它的請求參數便是:
searchType=song&searchKeyWord=不謂俠
使用方法:
request.args['keyword']
request.args.get('keyword')
記錄請求中的表單數據,一般用于表單提交。比如我們注冊網站時經常需要進行表單提交。
我們可以使用獲取表單中的內容:
request.form['keyword']
request.form.get('keyword')
返回請求中的參數和表單,這個用的比較少,暫不細說。
獲取網頁中的cookies的所有信息,也可以只獲取cookies中的一個參數的值。
request.cookies['keyword']
request.cookies.get('keyword')
返回請求網頁頭部信息,返回一個列表。
request.headers['keyword']
request.headers.get('keyword')
7)request.url、path、script_root、base_url、url_root
request.url:返回請求中的網頁地址
request.path:返回網頁存放地址
request.script_root:返回腳本根目錄
request.base_url:返回請求相對地址
request.url_root:返回請求網頁根目錄
返回請求的數據
request.data #返回一個字節類型的值
文件上傳必備,屬于提交表單的類型,所以這是個post類型的請求方式,我們可以使用files的file字段來設置:
@app.route('/upload',methods=['GET','POST'])
def upload():
if request.method == 'POST':
f = request.files['file']
filename = secure_filename(f.filename) #需要設置安全文件類型
#f.save(os.path.join('app/static',filename))兩種保存方式
f.save('app/static/'+str(filename))
return 'ok'
else:
return 'fail'
返回json格式的數據
返回環境變量的鍵值
返回客戶端的訪問ip地址
返回host信息
可能大部分人對這個概念比較難以琢磨,先來說說上下文,什么是上下文?一說起上下文,我猜大家第一時間一定會想起with,想到with大家肯定會想起上下文的模塊contexlib以及魔法方法enter 和exit,可以說,它是將復雜的事情簡單化的一個神器的裝飾器,我是這樣理解的。那么再來看看flask的上下文。
它作用于flask應用中,可以用作程序實例和存儲臨時變量,它可分為兩種:
g:處理請求時用作臨時存儲的對象,每次請求都會重設這個變量
current_app: 當前程序實例
顧名思義,它用于網絡請求中,它也有兩種。
request:請求對象
Session:存儲會話
再來看看鉤子,什么是鉤子?這一點是我們先要搞清楚的,鉤子其實就是在我們進行請求時,它規范了我們的請求內容和請求方式以及請求時該做什么,什么時候做,具體做哪些事,起到了一個承上啟下的作用,所以,它很有用處。
before_first_request
before_request
after_request
四、在每個請求結束后自動異常并將異常對象作為參數傳到函數中
teardown_request
after_this_request
說完了這么多那么它們該怎么用了,接下來請看我表演:
@app.before_first_request
def first():
print('我是第一運行的')
@app.before_request
def every():
print('我又來了')
@app.after_request
def recv(res):
res.headers['Content-Type']='application/json' #更改響應頭部數據
return res
@app.route('/start/<string:id>')
def start(id):
g.use=request.cookies.get('user')
if id==g.use:
return request.url
else:
return request.cookies
ac= app.app_context() #應用上下文管理器
ac.push() #進
print(ac)
a = current_app
print(a)
ac.pop() #出
print(ac)
with app.app_context() as f:
b= current_app
print(b)
print(f)
從上面的事例我們可以看出,隨著我們開發的東西越來越多,把所有東西放在一個文件里,很顯然不切實際。
我們嘗試著使用模塊調用,于是我編寫了兩個Python程序,用來調用:
demo1.py
from flask import Flask
app=Flask(__name__)
@app.route('/kj')
def df():
return 'hello world'
@app.route('/index')
def lk():
return 'efhsfj'
demo2.py
from flask import Flask,request
from demo1 import *
@app.route('/')
def login():
return request.url
if __name__ == '__main__':
app.run(debug=True)
這里demo2是可以成功調用demo1的,但是了,它無法操作demo1的變量以及一些實例,換言之就是只能調用,無法控制改變,于是這個時候藍圖就派上用場了,那么讓我們來看看吧。
demo3.py
from flask import Flask
from demo4 import root
from demo5 import admin
app=Flask(__name__) #應用實例
@app.route('/')
def lo():
return '1111'
app.register_blueprint(root,url_prefix='/') #藍圖對象和藍圖掛載點
app.register_blueprint(root,url_prefix='/root')
app.register_blueprint(root,url_prefix='/admin')
app.register_blueprint(admin,url_prefix='/')
app.register_blueprint(admin,url_prefix='/admin')
app.register_blueprint(admin,url_prefix='/root')
if __name__ == '__main__':
app.run(debug=True)
demo4.py
from flask import Flask,Blueprint
root=Blueprint('root',__name__) #藍圖名稱和藍圖所在的模塊
@root.route('/login')
def b1():
return 'hello'
@root.route('/index')
def b2():
return 'world'
demo5.py
from flask import Flask,Blueprint
admin=Blueprint('admin',__name__) #藍圖名稱和藍圖所在的模塊
@admin.route('/ff')
def bw():
return 'ergdsfg'
@admin.route('/gg')
def be():
return 'gtergsdf'
藍圖的精髓無非就是將多個模塊引入到一個主模塊中使用,相當于我們自己在寫模塊并把它當到藍圖中供調用。多個藍圖中如果有相同方法可用藍圖視圖函數來區分各自的方法。
一提到視圖,相信大家能想到它的意思,比如mysql數據庫中的視圖,道理其實都是互通的,并不會有太大的差別,只是功能不一樣罷了。創建視圖的方式也很簡單,都繼承自flask的views類。
from flask.views import View
def ff():
return 'ok'
class st(View):
def dispatch_request(self): #必須實現這個方法
return "任性的90后boy"
# 類視圖通過add_url_rule方法和url做映射
app.add_url_rule(rule='/ff',view_func=st.as_view('tt'))
2)方法視圖
from flask.views import MethodView
def gg():
return 'ok'
class login(MethodView):
#當客戶端通過get方法進行訪問的時候執行的函數
def get(self):
return 'get'
# 當客戶端通過post方法進行訪問的時候執行的函數
def post(self):
email = request.form.get("user")
password = request.form.get("pass")
if user== 'gffsadff' and pass== '4fsaferwf':
return "登錄成功"
else:
return "登陸失敗"
# 通過add_url_rule添加類視圖和url的映射,并且在as_view方法中指定該url的名稱,方便url_for函數調用
app.add_url_rule('/gg',view_func=login.as_view('lg'))
with app.test_request_context():
print('我是第一個運行的')
看到這你應該知道它是干嘛的了吧,沒錯。
它是整個應用中最先啟動的,可以用來做一個提醒界面啥的。
@app.route('/<path:url>',endpoint='name1') #路由別名為name1
def first_flask(url):
print(url_for('name1',url=url)) #如果設置了url參數,url_for(別名,加參數)
return redirect(url_for('get'))#重定向
3)添加路由規則
def fl():
return 'ok3'
#app.add_url_rule(rule=訪問的url,endpoint=路由別名,view_func=視圖名稱,methods=請求方法)
app.add_url_rule(rule='/kj',endpoint='name2',view_func=fl,methods=['GET'])
無需使用裝飾器的中央url映射方法,十分方便,要想實現它需創建三個文件:
myapp.py
from flask import Flask
import views
app = Flask(__name__)
@app.route('/')
def ll():
return 'index'
@app.route('/use/<usename>')
def use(usename):
return usename
views.py
def ll():
return 'index'
def use(usename):
return usename
main.py
from myapp import views
from flask import Flask
app=Flask(__name__)
app.add_url_rule('/', view_func=views.ll)
app.add_url_rule('/use/<usename>', view_func=views.use)
if __name__ == '__main__':
app.run(debug=True)
5)常用狀態碼
200:請求正確
404: 路徑錯誤
405: 請求方式錯誤
500: 服務器錯誤
302: 重定向
301 :永久重定向
本文著重講解了Flask的最基礎的用法,Flask是一個十分優秀的web開發框架,它可以十分迅速的開發出web應用,但是它需要依賴眾多的包才能完善更多的功能。
node.js + express + docker + mysql + jwt 實現用戶管理restful api
nodejs + mongodb 編寫 restful 風格博客 api
表格插件wpDataTables-將 WordPress 表與 Google Sheets API 連接
手把手教你用Python和Flask創建REST API
使用 Django 和 Django REST 框架構建 RESTful API:實現 CRUD 操作
ASP.NET Web API快速入門介紹
2024年在線市場平臺的11大最佳支付解決方案
完整指南:如何在應用程序中集成和使用ChatGPT API
選擇AI API的指南:ChatGPT、Gemini或Claude,哪一個最適合你?