2012-04-03 8 views
5

मैं स्नैप सत्र का उपयोग करने के तरीके के बारे में एक उदाहरण के लिए चारों ओर घूम रहा हूं। कुछ भी दूर नहीं है। क्या कोई मुझे कुकी आधारित सत्र के एक साधारण उदाहरण के साथ किसी लेख या कुछ को इंगित कर सकता है?हास्केल स्नैप: सत्र उदाहरण

एक कोड स्निपेट बहुत सराहना की जाएगी। सत्र में उपयोगकर्ता नाम डालने और प्रत्येक अनुरोध से पहले इसके अस्तित्व और वैधता की जांच करने की तरह कुछ। मैंने Snap.extension.session पर देखा लेकिन मैं अब भी लाइब्रेरी कोड से इसका उपयोग करने के तरीके को समझने के लिए बहुत कुछ नहीं हूं।

मैं समझता हूँ कि setInSession समारोह कुकी में सत्र मूल्य डाल करने के लिए है, लेकिन मैं काफी कैसे हस्ताक्षर से इसका इस्तेमाल करने की समझ सकते:

setInSession k v = Map.insert k v `liftM` getSession >>= setSession 

या कैसे एक साथ पूरी बात ग्लू के लिए।

मुझे नहीं पता कि यह नियम उदाहरण के लिए पूछने के नियमों के खिलाफ है, लेकिन अगर मैं नेट पर कुछ भी पा सकता हूं तो मैं ऐसा नहीं करूँगा।

अग्रिम धन्यवाद।

--- अद्यतन ---

मैं नीचे दिए गए उदाहरण का पालन किया और लिंक लेकिन चीजें अभी भी सही बाहर आ रहा नहीं कर रहे हैं।

मैं सिर्फ एक सरल परीक्षण चाहता हूं जो एक कुंजी और मूल्य पढ़ता है और इसे सत्र कुकी में रखता है, तो मैं सत्र मूल्य को वापस और प्रदर्शित करना चाहता हूं।

इसलिए मैंने अपना सत्र शुरू किया और इसे मुख्य एप्लिकेशन स्थिति में रखा।

s <- nestSnaplet "" sess $ initCookieSessionManager "config/site_key.txt" "sess" (Just 3600) 

पहला भ्रम कुंजी है कि सत्र प्रारंभिक प्रशंसा की आवश्यकता है। कुंजी प्रारंभिक प्रोजेक्ट सेटअप के दौरान नहीं बनाई गई है।

तो मैं इसे कैसे बना सकता हूं? प्रोजेक्ट फ़ाइल संरचना में जाने की कुंजी कहां है, तो फ़ंक्शन इसे ढूंढ सकता है?

तो संचालकों:

putCookie :: Handler App App() 
putCookie = do 
    par <- getPostParams 
    let k = T.decodeUtf8 $ head (par ! (B.pack "key")) 
    let v = T.decodeUtf8 $ head (par ! (B.pack "value")) 
    with sess $ setInSession k v 
    heistLocal (bindString "message" "Cookie inserted!") $ render "reply" 

यह एक बस कुंजी और एक वेब फार्म से मूल्य पढ़कर उस पर कुकी में महत्वपूर्ण मूल्य जोड़ी डाल करने के लिए माना जाता है। खैर, जाहिर है यह नहीं है।

shCookie :: Handler App App() 
shCookie = do 
    v <- with sess $ getFromSession "key" 
    heistLocal (bindString "message" (fromMaybe "" v)) $ render "reply" 

यह सिर्फ इसे वापस पढ़ता है और प्रदर्शित करता है। मुझे हमेशा एक खाली स्ट्रिंग मिलती है जिसका मतलब है कि ऐसी कोई चीज़ नहीं है।

क्या इनमें से कोई भी गलत दिखता है? मैं गलती कहां करूं? यह सब सही संकलित करता है लेकिन सत्र कुकी बस वहां नहीं है।

उत्तर

3

Snap.extension.session का अर्थ this मॉड्यूल है? AFAIK snap-auth पैकेज को बहिष्कृत किया गया है।

आप snaplet के रूप में लागू नए session api का उपयोग कर सकते हैं।

example देखें कि सत्र और ऑथ स्नैपलेट का उपयोग करने के लिए अपना एप्लिकेशन कैसे सेट करें। तो फिर तुम सत्र में डाटा स्टोर करने में सक्षम हो जाएगा:

data App = App 
{ _heist :: Snaplet (Heist App) 
, _sess :: Snaplet SessionManager 
, _auth :: Snaplet (AuthManager App) 
} 
makeLens ''App 

myHandler :: Handler App App() 
myHandler = do 
    with sess $ setInSession "key" "value" 

जोड़ा: साइट कुंजी के साथ

फ़ाइल स्वचालित रूप से बनाया जाएगा। फ़ंक्शन initCookieSessionManager (परिभाषित here) फ़ंक्शन clientsession पैकेज से उपयोग करता है (here देखें)। डॉक्स से: If the file does not exist or is corrupted a random key will be generated and stored in that file.

मैं अपने हैंडलर नहीं काम करता है क्योंकि आप सत्र नहीं की लगता है (commitSessionhere देखें) आप इसे हर हैंडलर कि सत्र अद्यतन करता है में प्रतिबद्ध कर सकते हैं या wrapHandlers और/या withSession का उपयोग यह करने के लिए खुद ब खुद।

+0

उदाहरण के लिए धन्यवाद। मैंने आपके लिंक का पालन किया लेकिन चीजें अभी भी किसी कारण से काम नहीं करतीं। मैं अपने मूल प्रश्न को कुछ और भ्रम बिंदुओं के साथ अपडेट कर दूंगा। –

+0

अद्यतन उत्तर – Yuras

+0

अच्छा देखें। अब सब कुछ काम करता है। जैसा कि आपने सुझाव दिया था, मुझे केवल प्रतिबद्धता जोड़ने की ज़रूरत थी। धन्यवाद। बड़ी मदद। –

संबंधित मुद्दे