亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

從零開(kāi)始用 Flask 搭建一個(gè)網(wǎng)站(三)

mykurisu / 2419人閱讀

摘要:從零開(kāi)始用搭建一個(gè)網(wǎng)站二介紹了有關(guān)于數(shù)據(jù)庫(kù)的運(yùn)用,接下來(lái)我們?cè)谕晟埔幌聰?shù)據(jù)在前端以及前端到后端之間的交互。在中有和兩個(gè)函數(shù),分別是請(qǐng)求成功和失敗的回調(diào)函數(shù)。作者極光為極光團(tuán)隊(duì)賬號(hào),歡迎關(guān)注原文從零開(kāi)始用搭建一個(gè)網(wǎng)站三知乎專(zhuān)欄極光日?qǐng)?bào)

從零開(kāi)始用 Flask 搭建一個(gè)網(wǎng)站(二) 介紹了有關(guān)于數(shù)據(jù)庫(kù)的運(yùn)用,接下來(lái)我們?cè)谕晟埔幌聰?shù)據(jù)在前端以及前端到后端之間的交互。本節(jié)涉及到前端,因此也會(huì)講解一下 jinja2 模板、 jQuery 、 ajax 等用法。

下面我們來(lái)創(chuàng)建兩個(gè)界面,一個(gè)可以新建 channel ,并顯示,另一個(gè)可以創(chuàng)建 integration ,并且可以綁定一個(gè)之前創(chuàng)建的 channel 。

post2channel.html

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}

{% block head %}    
{{ super() }}    
    
    
    
    

{% endblock %}

{% block title %}極光寶盒-創(chuàng)建集成{% endblock %}
{% block navbar %}    
    
{{ super() }}
{% endblock %}

...

我們從第一行開(kāi)始來(lái)講解一下這個(gè)模板,第一句

{% extends "base.html" %}

從字面上可以明白這個(gè)模板繼承了 base.html 模板,使用 {% %} 是 jinja2 模板的語(yǔ)法,表示語(yǔ)句塊,還有一種分隔符 {{ }} ,表示變量,通常用來(lái)在模板上顯示。接下來(lái)是

{% block head %}

可以看到也是比較容易理解的語(yǔ)法, block 后接一個(gè) block name ,表示一個(gè)塊開(kāi)始的聲明,結(jié)束的時(shí)候用 {% end %} 即可。在塊中可以使用普通的 HTML 語(yǔ)法。{{ super() }} 表示繼承父模板的塊聲明,這里指繼承 base.html 中聲明的 head 塊。接下來(lái)是 css 和 js 文件的引用。此頁(yè)面使用了 toastr 來(lái)顯示通知,類(lèi)似于 Android 中的 Toast ,有興趣的可以了解一下它的詳細(xì)用法。

接下來(lái)是 HTML 代碼,有一個(gè)下拉輸入框和按鈕。


以上代碼就是下拉輸入框中的數(shù)據(jù)來(lái)源,用了一個(gè) for 循環(huán)來(lái)遍歷 channels 列表,并且用 li 包裹每個(gè)元素,這也是模板常見(jiàn)的用法。 channels 是在視圖函數(shù)中傳過(guò)來(lái)的。

auth/views.py

@auth.route("/new/post_to_channel", methods=["GET"])
def post_to_channel():    
  developer = get_developer()    
  dev_key = developer.dev_key    
  channels = get_channel_list()    
  return render_template("auth/new/post2channel.html", **locals())

remder_template 的第二個(gè)參數(shù)表明,渲染這個(gè) post2channel.html 頁(yè)面的時(shí)候,把以上所有的變量都傳遞到頁(yè)面中,這樣就可以使用 {{ }} 模板語(yǔ)法拿到。接下來(lái)回到 post2channel.html , 看到部分:

$("#create_integration_btn").click(function () {    
  var channel = $("#selected_channel").val();   
  console.log("create integration, channel: " + channel);    
  if (channel != "") {        
    $.ajax({            
    type: "POST",            
    contentType: "application/json; charset=utf-8",            
    url: "../../v1/developers/{{ dev_key }}/integrations",            
    data: JSON.stringify({channel: channel}),            
    success: function (data) {                
      if (data != undefined) {                    
        if (data["token"]) {                       
          window.location.href = "/auth/manage/create_integration/" + data["integration_id"] + "/" + data["token"] + "/" + channel                    
        }                
      } else {                    
        toastr.error("服務(wù)器異常");                
      }            
    },            
      error: function (error) {                
        console.log(error);                
        toastr.error("創(chuàng)建失敗");            
      },            
      dataType: "json"        
    })    
  }
})

這是創(chuàng)建集成按鈕的邏輯,用 jQuery 的 ajax 發(fā)送 post 請(qǐng)求,以 json 格式將輸入框中的 channel 值傳到 url 表明的視圖函數(shù)。這里的 url 是相對(duì)路徑。在 ajax 中有 success 和 error 兩個(gè)函數(shù),分別是請(qǐng)求成功和失敗的回調(diào)函數(shù)。下面看到這個(gè)請(qǐng)求的視圖函數(shù),我們來(lái)看看視圖函數(shù)是如何處理從頁(yè)面?zhèn)鬟^(guò)來(lái)的數(shù)據(jù)。

api_1_0/developers.py

# 添加一個(gè)集成,并返回 integration_id ,如果 channel 已存在,直接綁定該 channel , 否則新建一個(gè) channel@api.route("/developers//integrations", methods=["POST"])
def create_integrations(dev_key):
# 先判斷一下傳過(guò)來(lái)的 json 數(shù)據(jù)是否符合要求
  if not request.json or not "channel" in request.json:    
    print("request json error")    
    abort(400)
#從數(shù)據(jù)庫(kù)得到 developer
  developer = Developer.query.filter_by(dev_key=dev_key).first()
  if developer is None:    
    print("developer not found")    
    abort(400)
  #以下省略
  ...
  #最后返回相關(guān)數(shù)據(jù)
  return jsonify({"integration_id": new_integration_id,                
                  "token": token.decode("utf-8")}), 201

以上代碼創(chuàng)建成功后也返回了一個(gè) json ,這樣在 success 的回調(diào)函數(shù)中就能得到這個(gè)數(shù)據(jù),用于在跳轉(zhuǎn)到其他界面的時(shí)候做一些初始化操作。即以下代碼:

if (data != undefined) { 
  if (data["token"]) { 
    window.location.href = "/auth/manage/create_integration/" + data["integration_id"] + "/" + data["token"] + "/" + channel 
  } 
}

這里將參數(shù)放到 url 中,調(diào)用了對(duì)應(yīng)的視圖函數(shù):

auth/views.py

@auth.route("/manage/create_integration///", methods=["GET", "POST"])
def create_integration(integration_id, token, channel):    
  integration = Integration.query.filter_by(integration_id=integration_id).first()    
  channels = get_channel_list()    
  developer = get_developer()    
  dev_key = developer.dev_key    
  return render_template("auth/create.html", **locals())

可以看到上面的參數(shù)就是從 post2channel 頁(yè)面?zhèn)鬟^(guò)來(lái)的,并且還從數(shù)據(jù)庫(kù)中查詢(xún)到對(duì)應(yīng)的 integration ,然后將相關(guān)數(shù)據(jù)傳到 create.html ,讓后者渲染頁(yè)面。

我們通過(guò)一個(gè)例子看到數(shù)據(jù)在前端和后端、前端之間的交互??偨Y(jié)一下,無(wú)非就是在前端頁(yè)面中發(fā)送請(qǐng)求,然后在視圖函數(shù)中操作數(shù)據(jù)庫(kù),并且返回相關(guān)數(shù)據(jù),回調(diào)到前端頁(yè)面中,最后在回調(diào)中調(diào)用另一個(gè)視圖函數(shù),在跳轉(zhuǎn)頁(yè)面時(shí)利用得到的數(shù)據(jù)渲染頁(yè)面。一切就是這么簡(jiǎn)單,沒(méi)什么黑魔法!源碼在 github 上。下一節(jié)介紹一下 flask_oauthlib 的用法,學(xué)習(xí)一下如何使用 oath2 第三方授權(quán)登錄以及調(diào)用提供方的相關(guān) API 。


作者: KenChoi - 極光( JPush 為極光團(tuán)隊(duì)賬號(hào),歡迎關(guān)注)

原文:從零開(kāi)始用 Flask 搭建一個(gè)網(wǎng)站(三)

知乎專(zhuān)欄:極光日?qǐng)?bào)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/8963.html

相關(guān)文章

  • 從零開(kāi)始 Flask 搭建一個(gè)網(wǎng)站(四)

    摘要:前言從零開(kāi)始用搭建一個(gè)網(wǎng)站三介紹了網(wǎng)頁(yè)前端與后端前端與前端之間數(shù)據(jù)的交流。作者極光為極光團(tuán)隊(duì)賬號(hào),歡迎關(guān)注原文從零開(kāi)始用搭建一個(gè)網(wǎng)站四知乎專(zhuān)欄極光日?qǐng)?bào) 前言 從零開(kāi)始用 Flask 搭建一個(gè)網(wǎng)站(三) 介紹了網(wǎng)頁(yè)前端與后端、前端與前端之間數(shù)據(jù)的交流。本節(jié)主要介紹一下如何應(yīng)用 Flask-OAuthlib, 使用 Flask-OAuthlib 就可以輕松地請(qǐng)求第三方應(yīng)用提供的 API 。...

    CarterLi 評(píng)論0 收藏0
  • 從零開(kāi)始 Flask 搭建一個(gè)網(wǎng)站(二)

    摘要:從零開(kāi)始用搭建一個(gè)網(wǎng)站一介紹了如何搭建環(huán)境,以及應(yīng)用基本項(xiàng)目結(jié)構(gòu)。我們要搭建的網(wǎng)站是管理第三方集成的控制臺(tái),類(lèi)似于。我們先定義一個(gè)用戶(hù)模型然后在文件夾下創(chuàng)建一個(gè)文件。 從零開(kāi)始用 Flask 搭建一個(gè)網(wǎng)站(一) 介紹了如何搭建 Python 環(huán)境,以及 Flask 應(yīng)用基本項(xiàng)目結(jié)構(gòu)。我們要搭建的網(wǎng)站是管理第三方集成的控制臺(tái),類(lèi)似于 Slack。 本篇主要講解數(shù)據(jù)如何在 Flask 應(yīng)用...

    Coly 評(píng)論0 收藏0
  • 從零開(kāi)始搭建論壇():Flask框架簡(jiǎn)單介紹

    摘要:我們的論壇項(xiàng)目就使用了該框架。此外,麥子學(xué)院也有一個(gè)入門(mén)視頻教程,一共小時(shí)的視頻教程,涵蓋開(kāi)發(fā)的方方面面,包括環(huán)境的搭建,語(yǔ)法介紹,項(xiàng)目結(jié)構(gòu)的組織,全球化,單元測(cè)試等內(nèi)容。博客地址更多閱讀的機(jī)制三個(gè)框架的對(duì)比 前面兩篇文章中我們已經(jīng)了解 Web(HTTP)服務(wù)器,Web應(yīng)用程序,Web框架,WSGI這些 Python Web 開(kāi)發(fā)中的概念。我們知道,Web框架通過(guò)將不同Web應(yīng)用程序中...

    Alan 評(píng)論0 收藏0
  • 從零開(kāi)始搭建論壇(一):Web服務(wù)器與Web框架

    摘要:服務(wù)器通過(guò)協(xié)議與客戶(hù)端通信,因此也被稱(chēng)為服務(wù)器。本文標(biāo)題為從零開(kāi)始搭建論壇一服務(wù)器與框架本文鏈接為更多閱讀自己動(dòng)手開(kāi)發(fā)網(wǎng)絡(luò)服務(wù)器一自己動(dòng)手開(kāi)發(fā)網(wǎng)絡(luò)服務(wù)器二自己動(dòng)手開(kāi)發(fā)網(wǎng)絡(luò)服務(wù)器三服務(wù)器網(wǎng)關(guān)接口實(shí)現(xiàn)原理分析最佳實(shí)踐指南應(yīng)用淺談框架編程簡(jiǎn)介 之前用 Django 做過(guò)一個(gè)小的站點(diǎn),感覺(jué)Django太過(guò)笨重,于是就準(zhǔn)備換一個(gè)比較輕量級(jí)的 Web 框架來(lái)玩玩。Web.py 作者已經(jīng)掛掉,項(xiàng)目好...

    dantezhao 評(píng)論0 收藏0
  • 從零開(kāi)始搭建論壇(二):Web服務(wù)器網(wǎng)關(guān)接口

    摘要:在從零開(kāi)始搭建論壇一服務(wù)器與框架中我們弄清楚了服務(wù)器應(yīng)用程序框架的概念??蚣軕?yīng)用生成狀態(tài)碼以及響應(yīng)報(bào)頭,然后將二者傳遞至,等待服務(wù)器保存。添加響應(yīng)頭,狀態(tài)碼返回響應(yīng)信息創(chuàng)建一個(gè)服務(wù)器實(shí)例目前支持的成熟服務(wù)器有很多,是相當(dāng)不錯(cuò)的一個(gè)。 在 從零開(kāi)始搭建論壇(一):Web服務(wù)器與Web框架 中我們弄清楚了Web 服務(wù)器、Web 應(yīng)用程序、Web框架的概念。對(duì)于 Python 來(lái)說(shuō),越來(lái)越多...

    Astrian 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<