Radiance是一個Web應用程序環境,有點像Web框架,但更一般,更靈活。它應該讓您可以輕鬆地編寫個人網站,並以一種可以在任何設置上使用,而無需進行特殊適應的方式,並且可以輕鬆地進行部署應用程序。
輻射和相關的模塊和應用程序通過QuickLisp在單獨的區域中分佈。要安裝輻射,請執行:
(ql-dist:install-dist "http://dist.shirakumo.org/shirakumo.txt")
(ql:quickload :radiance)
從那裡開始,您應該能夠通過QuickLisp的quickload直接加載並使用任何類型的輻射模塊。
您可以在此處找到一個介紹輻射率和大多數重要概念的教程,並探討如何在此處編寫Web應用程序。它應該給您一種很好的感覺,並為您提供有關在哪裡需要特定功能的指示。在最後一部分中,它也將進入生產服務器上的輻射安裝的實際設置和部署。
您最有可能要做的最基本的事情是提供某種HTML。因此,讓我們努力做到這一點,並逐漸擴展它。在開始之前,我們需要啟動輻射。
( ql :quickload :radiance )
( radiance :startup)如果這是您第一次設置Radiance,您將使用r-welcome模塊獲得有關它的註釋。它還應該為您提供一個可以在瀏覽器中打開的鏈接,以查看一些問候頁面。現在,我們只想將自己的小頁面與之一起。
( in-package :rad-user )
(define-page example " /example " ()
( setf (content-type *response* ) " text/plain " )
" Hi! " )訪問Local主機:8080/示例現在應該顯示“ HI”。確實很無聊。因此,讓我們吐出一些HTML。目前,我們將使用Cl- Who,因為它非常簡單。首先快速加載它,然後運行以下內容:
(define-page example " /example " ()
( cl-who :with-html-output-to-string (o)
( cl-who :htm
( :html
( :head ( :title " Example Page " ))
( :body ( :header ( :h1 " Couldn't Be Simpler. " ))
( :main ( :p " Trust me on this one. " )))))))後來進行了重新編譯和刷新,我們進行了一些字體樣式。接下來,我們可能想向其添加一個CSS文件以正確樣式。我們也可以使用另一個頁面為CSS提供服務,但從長遠來看,這並不是最好的方法。
相反,讓我們看一下如何創建一個模塊,這將使我們能夠以更有序的方式整理事物。您可以手動創建模塊的文件,但是現在我們將使用Radiance可以為您提供的自動生成的骨架來解決。
(create-module " example " )它應該返回一個模塊所在的路徑。它應包含一個ASDF系統,一個主LISP文件以及兩個static和template 。令人驚訝的是,如果您碰巧使用模板系統,則static文件夾是靜態服務文件的位置, template是用於模板文檔的。
讓我們打開example.lisp ,然後從中瀏覽我們的示例頁面。
(define-page example " /example " ()
( cl-who :with-html-output-to-string (o)
( cl-who :htm
( :html
( :head ( :title " Example Page " ))
( :body ( :header ( :h1 " Couldn't Be Simpler. " ))
( :main ( :p " Trust me on this one. " )))))))頁面由名稱符號標識。由於我們現在擁有自己的模塊,因此可以使用自己的軟件包,因此上面的示例符號將與以前使用過的符號相同。我們只需要刪除rad-user軟件包中的頁面即可避免衝突。
(remove-page ' rad-user::example)每當您立即更改時,請確保加載示例文件,以使更改生效。接下來,讓我們創建一個簡單的CSS文件,以使內容稍微塗抹一點。該文件將是example.css放置在static文件夾中。如果您不想寫自己的示例CSS。
body {
font-family : sans-serif;
font-size : 12 pt ;
background : # EEE ;
}
header {
text-align : center;
}
main {
width : 800 px ;
margin : 0 auto 0 auto;
background : # FFF ;
padding : 10 px ;
border : 1 px solid # BBB ;
border-radius : 5 px ;
}接下來,我們需要修改HTML以實際鏈接到樣式表。為了獲取樣式表的地址,我們必須利用Radiance的路由系統。不過請放心,這並不是一件麻煩。
(define-page example " /example " ()
( cl-who :with-html-output-to-string (o)
( cl-who :htm
( :html
( :head ( :title " Example Page " )
( :link :rel " stylesheet " :type " text/css "
:href (uri-to-url " /static/example/example.css " :representation :external )))
( :body ( :header ( :h1 " Couldn't Be Simpler. " ))
( :main ( :p " Trust me on this one. " )))))))刷新頁面,瞧,現在它也有一些挑戰。您可能需要為整個uri-to-url業務的解釋。完整解釋它是由此後的部分來處理的,但是它的要旨是確保在任何設置下正確解決靜態文件的鏈接。
Radiance中最中心的概念之一是URI。 URI是由域列表,可選端口號和路徑列表組成的對象(請參閱uri )。從本質上講,它是一般URI的脫衣舞版本,因此不包括模式,查詢或片段部分。另一個重要的區別是,在整個框架中,烏里斯的domains都在捕獲位置和處理調度匹配的整個框架中使用。
請注意,烏里斯是可變的。這對於性能很重要,因為URI修改必須在關鍵路徑上的幾個部分中進行。但是,在通常的情況下,預計URI不會在一些選擇功能之外進行修改。以意想不到的方式修改URI的部分可能會導致奇怪的行為。
URI具有獨特的字符串表示形式,可以序列化為字符串,並再次解析回完整的URI對象。烏里斯(Uris)也可以作為文字作為fasl文件傾倒,因此從宏中散發它們是可以的。 URI的語法如下:
URI ::= DOMAINS? (':' PORT)? '/' PATH?
DOMAINS ::= DOMAIN ('.' DOMAIN)*
DOMAIN ::= ('a'..'Z' | '0'..'9' | '-')
PORT ::= ('0'..'9'){1, 5}
PATH ::= .*
您可以使用uri-to-url將URI變成混凝土URL。所有零件的逆轉,編碼和正確的格式都會自動為您處理。
請參閱uri , domains , port , path , matcher , uri-string , make-uri , make-url , ensure-uri , copy-uri , parse-uri , uri< , uri> , uri= , uri-matches , merge-uris , represent-uri , uri-to-url 。
為了封裝發送和從發送的數據,我們有一個請求( request )和響應( response )對象的想法。請求對象包含代表請求所在位置的URI,以及HTTP有效負載中包含的所有數據,例如帖子,GET,HEAD,HEADER和COOKIE變量。響應對象包含返回代碼,標題,cookie和實際數據。
在處理請求期間,這兩個對象必須始終存在並綁定到*request*和*response*變量。它們封裝了生成動態頁面所需的許多非常重要的信息。此外,請求包含一個不透明的data表,您可以在其中存儲任意數據。當您需要在請求執行期間可以到達的系統各個部分之間交換信息時,這很有用。
請求不一定來自HTTP服務器。為了測試事項,您還可以自己構建請求並以編程方式發送。無論如何,調用請求的主要接口稱為request 。這將為您構建一個請求和響應對象,並適當處理URI。如果您想自己執行此操作,並且實際上只需發送完整的請求對象,則可以使用execute-request 。
有關請求的實際處理,請參閱調度程序,頁面和API端點。
See *request* , *response* , *default-external-format* , *default-content-type* , request , uri , http-method , body-stream , headers , post-data , get-data , cookies , user-agent , referer , domain , remote , data , issue-time , response , data , return-code , content-type , external-format , headers , cookies , cookie , name , value , domain , path , expires , http-only , secure , cookie-header , cookie , get-var , post-var , post/get , header , file , redirect , serve-file , request-run-time , *debugger* , handle-condition , render-error-page , execute-request , set-data , request
在派遣請求之前,它會經過所謂的路由系統。與其他框架不同,在其他框架中,“路由”指定了處理請求的內容,在Radiance A路線( route )是URI轉換器的一種形式。系統的這一部分是負責創建和維護兩個“宇宙”,一個內部和外部的部分。
內部宇宙是一個實際的Web應用程序。外部宇宙是HTTP服務器和網站的用戶居住的一個。為了讓您一隻手,一隻手編寫Web應用程序,而不必擔心服務器上的潛在設置可能會像某個時候看起來如何。您不必擔心運行應用程序可能需要使用哪種域,端口,路徑設置。另一方面,它使您可以作為一個網絡介紹,可以自定義並運行系統,以確切的需求,而不必擔心破壞事情。
這一切都是通過路線來促進的,其中有兩種:映射和逆轉路線。映射路線負責將URI從外部宇宙轉變為內部宇宙之一。通常,這涉及切除頂級域,並可能進行子域的映射。反轉路線相反 - 它們從內部宇宙轉到外部。為了在您的服務頁面中建立鏈接是必要的,請參考實際上可以從外部訪問的資源。通常,這涉及逆轉子域映射並再次添加頂級域。
路線可以執行任意工作。在最基本的層面上,它們只是以某種方式修改URI的函數。這使您可以創建一個非常靈活的系統,該系統應該足夠強大,以滿足您作為管理員的所有需求。作為應用程序作者,您只需要確保在您放入頁面的所有鏈接上使用external-uri或uri-to-url即可。
請參閱route , name , direction , priority , translator , route , remove-route , list-routes , define-route , define-matching-route , define-target-route , define-string-route , internal-uri , external-uri
最後,我們來到了實際生成請求內容的部分。 URI調度員是URI的一個子類,它也帶有名稱,功能和優先級。 LIVE在優先級列表中,每當請求到達時都會處理。請求的URI與每個調度程序匹配。然後執行匹配的第一個調度程序的功能。
就是這樣。調度程序的函數負責在響應對像中設置必要的值以交付頁面內容。為了做到這一點,它可以直接設置響應對象的data字段,也可以從函數返回適當的值。輻射僅接受四種類型的值: stream , pathname , (array (unsigned-byte 8)) string 8)) 。
如果URI調度程序沒有明確的優先級編號,則其優先級與其他優先級由URI的特異性確定。有關如何確切計算的說明,請參見URI排序函數uri> 。
請參閱uri-dispatcher , name , dispatch-function , priority , uri-dispatcher -DISPATCHER , remove-uri-dispatcher , list-uri-dispatchers , uri-dispatcher> , define-uri-dispatcher , dispatch
頁面是您可能用來定義實際內容服務功能的內容。但是,一個頁面只是一個URI-DISPATCHER,在定義宏中具有一些額外功能,使您更容易。最值得注意的是可擴展的選項,您可以在下面找到一個說明。
Radiance本身設置了幾個默認頁面。首先是favicon和robots頁面,它們只是為Radiance的static/目錄提供各個文件。您可能需要為其提供自己的頁面,或更新生產服務器上的文件。
然後是static頁面,該頁面負責為所有Web應用程序和模塊提供靜態內容。它應在任何域上都處於活動狀態,並且始終在路徑/static/...中始終具有...必須具有一個形式,其中第一個目錄是模塊的名稱,其餘的是該模塊static/目錄中的路徑。這使您始終能夠通過通用路徑參考CSS,JS和圖像等靜態文件。
最後,有一個api頁面,該頁面負責處理API端點的調度,這將在以下部分中進行了解釋。通過捕獲所有域上的/api/...路徑,該頁面的作用與靜態的頁面相似。
請參閱page , remove-page , define-page
Radiance為REST API定義提供了集成支持。這不僅是一個已解決的功能,而且是因為大多數現代應用程序都希望提供某種API,並且因為Radiance建議某種撰寫您的應用程序的方法,而該應用程序必然涉及API端點。
從概念上講,API端點是通過瀏覽器請求可調用的函數。然後將它們的響應序列化為請求者可讀的格式,無論是什麼。重要的是要記住的是,API端點應該由用戶和程序都可以使用。 Radiance鼓勵這一點,因為通常可以通過API通過API執行的任何類型的操作也必須以某種方式執行。為了避免重複,可以將兩者混合在一起。
因此,通常應通過API端點提供任何類型的數據修改操作,該操作根據用戶還是應用程序請求的,其反應略有不同。對於用戶,通常應將其重定向到適當的頁面,在應用程序的情況下,應以可讀格式提供數據有效負載。
所有這些的第一部分是API格式系統,該系統負責將數據序列化為某些指定格式。默認情況下,僅提供基於S-表達的格式,但是可以輕鬆加載獲得JSON輸出的貢獻。
第二部分是browser帖子/獲取參數的規範。如果該參數包含確切的字符串"true" ,則將API請求視為來自用戶的,因此應輸出重定向而不是數據有效負載。
您的應用程序應利用這些東西來提供正確集成的API。現在,一個實際的端點定義由名稱,原始函數,一個描述該函數參數的lambda列表和請求解析函數組成。通常,對於您的論點,僅必需的論證和可選論點是有道理的。畢竟,HTTP請求僅具有可以提供的“關鍵字參數”,並且可以存在或丟失。
API端點的名稱也用作標識符,告訴您可以在哪裡到達。 API端點活在/api/路徑上,然後是端點的名稱。因此,您負責將端點用模塊或應用程序的名稱前綴,以免意外地絆倒其他端點。這與URI調度程序不同,因為API端點必須完全匹配,並且不允許對路徑進行任何歧義或處理。因此,每個端點都必須具有獨特的路徑,也可以立即用作名稱。
原始函數是API為接口提供的函數。它負責執行請求的操作並如上所述返回適當的數據。有關返回格式化的API數據,請參見api-output 。有關瀏覽器請求的重定向,請參見redirect 。
最後,請求解析函數負責取一個請求對象,從中提取函數所需的參數,最後用適當的參數調用該函數 - 如果可能的話。如果缺少所需的參數,解析功能可能會api-argument-missing錯誤發出信號。多餘的參數應被忽略。
您還可以使用call-api編程地調用API端點,也可以使用call-api-request模擬請求調用,而無需瀏覽整個URI調度機制。
與頁麵類似,API端點定義還接受可擴展的選項,使定義更簡單。有關選項的說明,請參見以下部分。
See api , *default-api-format* , *serialize-fallback* , api-format , remove-api-format , list-api-formats , define-api-format , api-output , api-serialize , api-endpoint , remove-api-endpoint , list-api-endpoints , api-endpoint , name , handler , argslist , request-handler , call-api-request , call-api , define-api
選項是提供可擴展的定義宏的一種方式。當一個框架提供了定義某些東西的共同方法時,這很有用,但是其他部分可能希望為此提供擴展,以使常見的操作更短。例如,一個常見的任務是將頁面或API端點限制給具有所需訪問憑據的人。
為了促進這一點,Radiance提供了一種相當通用的選項機制。選項除以一種選項類型,該選項類型指定了該選項所屬的定義宏。 Radiance提供了api和page選項類型。
每個選項都有一個名稱和擴展器函數的關鍵字,必須接受許多參數,具體取決於選項類型。始終以參數為定義的事物的名稱,定義的正文形式列表以及最終,可選的值,該值已在選項列表中提供給選項(如果有任何提及)。然後,此擴展功能負責以某種方式改變定義宏的身體形式。它還可以發出第二種形式,該表格放置在定義本身之外,以便以某種方式設置環境。
請參閱option , option-type , name , expander , option , remove-option , list-options , define-option , expand-options
模塊的概念對於輻射至關重要。它是整體“部分”的表示。在技術層面上,模塊是一個包含特殊元數據的軟件包。它由modularize系統提供,用於促進鉤子和触發器,接口以及其他一些信息的跟踪。
這對您意味著的是,您應該使用define-module表單來定義主包,而不是標準的defpackage 。語法與defpackage相同,但包含一些額外的選項,例如:domain ,它允許您指定該模塊應在其上操作的主要域(如果有)。
模塊系統還允許將ASDF系統綁定到模塊。如果完成了,則ASDF系統將成為“虛擬模塊”。為了做到這一點,您必須在系統定義中添加三個選項:
:defsystem-depends-on (:radiance)
:class "radiance:virtual-module"
:module-name "MY-MODULE"
這使輻射能夠將ASDF系統信息識別並關聯到您的模塊。有關新模塊的必要係統和模塊定義的自動創建,請參見create-module Module 。
See virtual-module , virtual-module-name , define-module , define-module-extension , delete-module , module , module-p , module-storage , module-storage-remove , module-identifier , module-name , current-module , module-domain , module-permissions , module-dependencies , module-required-interfaces , module-required-systems , module-pages , module-api-endpoints , describe-module , find-modules-directory , *modules-directory* , create-module
Radiance提供的一種機制是允許將模塊互入的機制是鉤子。掛鉤使您可以根據某種事件運行任意功能。例如,論壇軟件可能會在創建新帖子時會觸發一個掛鉤。然後,擴展名可以在執行其他任務的鉤子上定義觸發器。
鉤子可以在其上定義任意數量的觸發器,但是您應該確保觸發器不需要太長時間,因為觸發鉤子是一個阻止操作,直到所有觸發器都完成。因此,長期運行的觸發操作可能會延遲請求響應太長。
有時,鉤子應該更像開關,在該開關中可以長時間“打開”,直到稍後再次“關閉”。如果在此期間定義了新的觸發器,則應自動調用它們。這就是define-hook-switch促進。它產生兩個鉤子。一旦觸發了第一個,後來定義的任何觸發器都會自動調用,直到觸發第二個鉤子為止。這允許server-start之類的鉤子上的觸發器可以正常運行,即使僅在服務器啟動後才能定義觸發器。
請參閱list-hooks , define-hook , remove-hook , define-trigger , remove-trigger , trigger , define-hook-switch
為了避免變得整體,為了允許可擴展的後端,Radiance包括一個接口系統。從最一般的意義上講,接口提供了關於某些功能,宏,變量等如何工作的希望,但實際上並不能實際實現它們。使界面概述工作的所有內容的實際功能都將其推向實現。這使用戶可以對接口進行編碼並使用其提供的功能,而無需將自己綁在任何特定的後端。
對於具體示例,假設數據庫有一個接口。這是明智的,因為有許多不同類型的數據庫,它們都提供了許多不同的交互方式,但仍然提供了一些非常普遍的操作:存儲數據,檢索數據並修改數據。因此,我們創建了一個提供這些常見操作的界面。然後,它可以由特定類型的數據庫實現,以使實際操作起作用。作為應用程序作者,您可以使用數據庫界面,然後使您的應用程序自動在許多不同的數據庫中使用。
除了給應用程序作者一個優勢外,界面提供的解耦還意味著系統管理員可以相對輕鬆地編寫自己的實現,如果現有實現不滿足其特定要求。由於界面的不透明,實現都可以為在LISP過程中運行的東西提供橋樑,也可以提供完全外部的東西。這為生產系統的管理員提供了很多選擇,使他們可以準確選擇所需的東西。
實際上,界面是特殊的模塊,因此是特殊的包裝。作為其定義的一部分,它們包括針對其他綁定,例如函數,變量等的一系列定義。由於它是一個軟件包,作為用戶,您可以使用接口的組件,就像您在任何其他軟件包中使用其他任何內容一樣。沒有區別。作為實現作者,您只需重新定義接口概述的所有定義即可。
為了實際加載使用接口的模塊,必須事先加載接口的實現。否則,宏無法正常工作。因此,為了允許根據ASDF系統定義中的接口而無需參考特定的實現,Radiance提供了ASDF擴展。此擴展程序使得可以在您的:depends-on列表中添加(:interface :foo)之類的列表。然後,當裝載模塊時,輻射將使接口解析到其混凝土實現。
Radiance提供了許多標準接口。這些接口中的每一個至少具有輻射範圍提供的一個標準實現。接口是:
adminauthbancachedatabaseloggermailprofilerateserversessionuser接口在下面深入描述。
請參閱interface , interface-p , implementation , implements , define-interface , define-implement-trigger , find-implementation , reset-interface load-implementation implementation , define-interface-extension , Define-Implement-Trigger
為了允許在同一台計算機上使用不同的設置運行多個輻射實例,Radiance提供了所謂的環境系統。環境基本上是輻射本身和所有加載模塊的配置和運行時文件集。輻射配置還包括將接口映射到所選的實現,因此決定如果請求接口應該選擇什麼。
當startup啟動時,最早選擇使用的特定環境,而最早是加載模塊時的。在後一種情況下,提供了交互式重新啟動以允許您選擇環境。這是必要的,因為否則Radiance將無法解析接口映射。
作為環境系統的一部分,Radiance為您提供了一個配置系統,您可能(可能應該)將其用於應用程序。它確保為每個環境正確地將設置正確地複用,並且設置始終是持久的。它還使用人類可讀的存儲格式,以便可以在不需要任何特殊工具的情況下讀取和修改文件。
有關配置存儲的實際處理和使用實體,請參見普遍存在。只需注意,Radiance而不是value函數,而是提供config功能。
除了配置文件外,環境還為運行時數據文件(例如用戶上傳,緩存文件等)提供一致的存儲位置。您可以使用environment-module-directory和environment-module-pathname來檢索此位置。存儲上傳和緩存時,模塊應使用這些路徑向管理員提供一致的接口。
在部署的系統上,可能希望更改環境存儲路徑的位置,在這種情況下,鼓勵管理員提供有關environment-directory和environment-module-directory的新方法,以根據需要自定義行為。另請參見關聯的文檔字符串,以獲取更多詳細信息和默認操作。
環境還允許管理員覆蓋。使用:static和:template類型用於environment-module-directory模板類型為您提供了存儲文件的路徑,該文件應覆蓋模塊的標準模板和靜態文件。相應目錄中的路徑必須與模塊自己的源文件的路徑匹配。請注意,模塊實際使用的靜態和模板文件是在模塊加載時緩存的,因此除非重新啟動LISP映像,否則將不會更改,或者重新加載了模塊的源文件。
See environment-change , environment , environment-directory , environment-module-directory , environment-module-pathname , check-environment , mconfig-pathname , mconfig-storage , mconfig , defaulted-mconfig , config , defaulted-config , template-file , @template , static-file , @static
有時系統以不相容的方式向後發展。在這種情況下,要使現有的設置繼續使用新版本,運行時數據遷移是必要的。 Radiance提供了一個自動化此過程並允許平穩升級的系統。
版本之間的遷移應在Radiance的啟動序列期間自動發生。作為管理員或作者,您不需要執行任何其他步驟以進行遷移。但是,作為模塊作者,您自然必須提供代碼來為模塊執行必要的數據遷移步驟。
為了使模塊遷移,需要由具有版本規範的ASDF系統加載。該版本應遵循標準虛擬數字方案,並帶有可選版本的哈希,可以在最後添加。然後,您可以通過使用define-version-migration來定義單個版本之間的遷移步驟。定義後,Radiance將自動拾取具體版本,並按順序執行必要的遷移以達到當前目標版本。有關精確過程以及您可以做什麼的更多信息,請參閱migrate和migrate-versions 。
請參閱last-known-system-version , migrate-versions , define-version-migration , ready-dependency-for-migration , ensure-dependencies-ready , versions , migrate
最後,Radiance提供了一個標準的啟動和關閉序列,該序列應確保正確設置並準備好事物,然後再次清理。該順序的很大一部分只是確保以適當的順序和適當的時間調用某些鉤子。
雖然您可以通過使用適當的接口函數手動啟動服務器,但如果這樣做,您不應期望應用程序可以正確運行。他們中的許多人會期望召喚某些鉤子以正常工作。這就是為什麼您應該始終,除非您完全知道自己在做什麼,否則請使用startup和shutdown來管理輻射實例。這兩個功能的文檔應準確解釋哪些鉤子是觸發的以及在哪個順序上。只要未導出所述符號,實現可能會在接口軟件包中的符號上提供其他未指定的定義。
請參閱*startup-time* , uptime , server-start ,服務器, server-ready ,服務器server-stop , server-shutdown , startup , startup-done , shutdown , shutdown-done , started-p
這些接口以輻射率分佈,是核心軟件包的一部分。但是,庫可以提供其他接口。對於標準接口的實現,允許接口定義約束的以下放寬:
包含&key參數的lambda列表可以通過進一步的依賴於實現的關鍵詞參數來擴展。包含&optional &key列表可以通過進一步的可選&rest擴展。僅包含所需參數的lambda列表可以通過進一步的可選或關鍵字參數擴展。
該界面提供了一個管理頁面。它應用於任何類型的用戶可配置設置或系統信息顯示。請注意,儘管被稱為“管理”,但這並不僅針對系統管理員。該頁面應適用於任何用戶。
管理頁面必須能夠顯示分類的菜單和麵板。面板由其他模塊提供,可以通過admin:define-panel添加。允許訪問敏感操作的面板應通過以下方式適當限制:access選項和非默認許可。有關權限的說明,請參見用戶界面。
為了鏈接到管理頁面或其中的特定面板,請使用page資源類型。
請參閱admin:list-panels admin:define-panel ,管理員admin:remove-panel , Admin admin:panel
身份驗證接口負責將用戶與請求聯繫起來。因此,它必須提供某種方式,用戶可以通過對系統進行身份驗證自己。這是如何完全完成的。但是,實現必須提供一個啟動身份驗證過程的頁面。您可以通過page資源獲取URI並將"login"作為參數傳遞。
您可以測試auth:current與請求相關的當前用戶。這也可能返回NIL ,在這種情況下,用戶應被解釋為"anonymous" 。有關更多信息,請參見用戶界面。
請參閱auth:*login-timeout* , auth:page , auth:current , auth:associate
該界面提供IP驅動器。它必須防止通過禁止IP連接的任何客戶端查看所需的實際頁面的內容。禁令可以在超時後手動或自動舉起。實施可能會或可能不會付出額外的努力來跟踪IPS的用戶。
參見ban:jail , ban:list , ban:jail-time , ban:release
緩存界面提供了具有可自定義無效測試的通用緩存機制。您可以通過cache:renew 。要定義一個緩存的塊,只需使用cache:with-cache ,如果測試形式評估為true,則會導致返回身體的緩存值。
存儲緩存值的確切方式取決於實現和cache:get或cache:with-cache可以將緩存值脅迫到字符串或字節數組。實現可以支持任何數量的高速值值,但至少必須支持字符串和字節數組。
緩存值的名稱必須是一個符號,其名稱和軟件包名稱不包含以下任何字符:<> princ <>:"/|?*.
請參閱cache:get , cache:renew , cache:with-cache
該接口為您提供一個數據持久性層,通常稱為數據庫。這不必是一個關係數據庫,但可能是一個。為了保留實施差異,僅支持基本數據庫操作(不加入,觸發器等)。數據類型還僅限於整數,浮點和字符串。儘管有這些限制,但數據庫接口對於大多數應用程序都足夠有用。
請注意,特定的術語用於與傳統的RDBMS術語距離:架構稱為“結構”。一張桌子稱為“集合”。一行稱為“記錄”。
在連接數據庫之前執行數據庫操作以未定義的行為結果。因此,您應該將收集創建表格( db:create )放在db:connected上的觸發器中。 radiance確保在輻射運行時連接數據庫,因此在任何頁面,API或URI調度程序定義中使用數據庫接口完全很好。
實際執行數據存儲的功能足夠直觀,稱為db:insert , db:remove , db:update , db:select和db:iterate 。其行為應該幾乎是您所期望的。請參閱各自的Docstrings以進行仔細檢查。另外,請參見db:create有關如何創建集合以及施加哪種限制的冗長解釋。
數據庫必須確保一旦數據操作完成完成,即使在不可預見的崩潰的情況下,也將在Radiance,Lisp Image或機器的重新啟動,LISP映像或機器上持續存在。
See database:condition , database:connection-failed , database:connection-already-open , database:collection-condition , database:invalid-collection , database:collection-already-exists , database:invalid-field , database:id , database:ensure-id , database:connect , database:disconnect , database:connected-p , database:collections , database:collection-exists-p , database:create , database:structure , database:empty , database:drop , database:iterate , database:select , database:count , database:insert , database:remove , database:update , database:with-transaction , database:query , database:connected , database:disconnected
該界面提供原始的記錄功能,以便您可以記錄有關係統中相關事件的消息。記錄的內容的實際配置在何處以及如何實現系統和管理員。
請參閱logger:log , logger:trace , logger:debug , logger:info , logger:warn , logger:error , logger:severe , logger:fatal
借助郵件界面,您可以獲得非常最小的設施來發送電子郵件。為了吸引網站本身以外的用戶,各種組件可能需要電子郵件訪問。發送電子郵件的方式的配置 - 示出服務器,本地sendmail等 - 取決於實現。
mail:send掛鉤允許您在發送電子郵件之前對其進行反應。
請參閱mail:send
配置文件界面提供了對用戶界面的擴展,這些應用程序通常在希望用戶具有某種存在的應用程序中使用。作為其中的一部分,接口必須提供一個可以顯示用戶“配置文件”的頁面。配置文件必須顯示某種面板。面板由其他模塊提供,可以通過profile:define-panel 。
您可以通過page資源類型獲得URI指向用戶的配置文件頁面。
該界面還提供了對“阿凡達圖像”的訪問權限,以視覺上識別用戶( profile:avatar ),這是一個可自定義的名稱,用戶可以更改( profile:name ),並且字段類型為用戶字段中包含哪種類型的數據,以及是否應該是公共信息( profile:fields profile:add-field profile:remove-field )。
請參閱profile:page , profile:avatar , profile:name , profile:fields , profile:add-field , profile:remove-field , profile:list-panels , profile:remove-panel ,配置profile:define-panel , profile:panel
該界面提供了一種限制機制,以防止垃圾郵件或過度渴望獲得潛在敏感或昂貴的資源。這以兩個步驟發生。首先,按rate:define-limit 。然後通過rate:with-limitation宏。如果某個用戶對塊的訪問過於頻繁,則不會調用塊,並且限制定義中的代碼將得到評估。
請注意,根據實施,速率限制是每位客戶, - 用戶或 - 交流,但肯定不是全球。
請參閱rate:define-limit , rate:left , rate:with-limitation
此和記錄器接口是唯一需要實現的接口輻射才能啟動。它負責以某種方式接受和答复HTTP請求。實施必須接受請求並將其轉移到Radiance request功能,然後將返回的response轉移回請求者。
請注意,指定偵聽器行為的實際參數是實現依賴性的,其配置也是如此。但是,如果適用,則必須為在(mconfig :radiance :port)配置的端口上的localhost上訪問的標準偵聽器提供實現,並且在radiance:startup時啟動。
請參閱server:start , server:stop , server:listeners , server:started , server:stopped
會話接口提供了在多個請求過程中跟踪客戶端的。但是,它不能保證完美跟踪客戶,因為他們可能會做幾件事以掩蓋或掩蓋自己或偽造信息。儘管如此,對於大多數用戶而言,會話跟踪應該足夠良好。
會話接口通常由其他接口或較低層的庫使用,以便提供信息的持久性,例如用戶身份驗證。
請參閱session:*default-timeout* , session:session session,session session:= , session:get session:list session:start session:id , session:timeout session:field , session:end , session:active-p , session:create
該界面提供了持久的用戶對象和權限系統。它不會照顧身份驗證,身份證明,跟踪或任何類似的東西。它僅提供一個可以在其上構建的用戶對像以及可以管理的權限。
請參閱user:user以獲取權限及其行為的描述。
See user:condition , user:not-found , user:user user , user user:= , user user:list , user:get , user:id , user:username , user user:fields , user:field , user:remove-field , user:remove , user:check , user:grant , user:revoke , user:add-default-permissions , user:create , user:remove , user:action , user:ready , user:unready
這是數據庫接口的擴展。任何實現此接口的模塊都必須實現數據庫接口。該界面提供了一些擴展,以允許僅由關係數據庫系統直接支持更具表達性的數據庫操作。
請參閱relational-database:join , relational-database:sql
*environment-root*已被刪除。取而代之的是,它被函數environment-directory的更通用的機制所取代。如果您以前定制*environment-root* ,請立即更改environment-directory ,如§1.11所述。template-file和static-file ,請參見第1.11節。user:id標識符,使您可以在數據庫中引用用戶並更有效地記錄。:unique db:select and db:iterate上。 如果您想支持Radiance的持續發展,請考慮成為Patreon的支持者: