සින්ඩියක් හදන්න කොච්චර ලේසිද කිව්වොත් මුලු සින්ඩියටම තියෙන්නේ ෆයිල් අටයි.
මුලින්ම දෙයියෝ ගාව තියන Getting Started: Python ලිපියට ගිහිල්ලා රවුමක් දාලා එන්න. එකේ තියනවා වින්ඩෝවල කොහොමද පයිතොන් ස්තාපිත කරගන්නේ කියලා.
මේකට ඔනේ
1.Python 2.5 - http://www.python.org/download/releases/2.5/
2.App Engine SDK - http://code.google.com/appengine/downloads.html
3.Windows Launcher for Google App Engine - http://code.google.com/p/google-appengine-wx-launcher/ -
හෝ http://code.google.com/p/google-app-engine-launcher/downloads/detail?name=GoogleAppEngine%20GUI.exe&can=2&q=
[ගුගල් වලට අප්ලෝඩ් කරන විදිහ]
වින්ඩෝස් 7 සඳහා තමයි සියලුම දේවල් මම යොදාගත්තේ. ඔය දෙකම භාගත කරගත්තට පස්සේ ඔබේ පරිගණකයේ සමාන්ය ආකාරයට ස්තාපනය කරගන්න පුලුවන්.
ගුගල් හොස්ටිං වල වෙනම ඩෙටා බේස් කතාවක් නැහැ. කෝඩ් එකෙන්ම තමයි ඩේටා බෙස් ටේබල් ඔක්කොම පාලනය කරන්න පුලුවන්.
සින්ඩියට අවශ්ය අපි හදන ෆයිල්
1. RSS ඇතුලු කිරිමට ෆොම් එකක් - bloglist.py
2. සින්ඩි කේට් කිරිමට හෙවත් cron රන් කිරිමට - cronblogpost.py
3. ලිපි පෙන්විමට - synditest.py
ඔන්න ඔය ෆයිල් තුනෙන් තමයි මූලිකව ඕක වෙන්නේ, ඊට අමතරව තුන් වන පාර්ෂවයෙන් ඕනා වෙනවා feedparser කියන RSS කියවන කෝඩ් එක.
හරි දැන් එකින් එක ෆයිල් බලමු
1.app.yaml මෙයා තමයි සියල්ල පාලන කරන්නේ
application: lankeeyasyndi මේ තියෙන්නේ ගුගල් එකේ අපේ ඇප්ලිකේෂන් අයිඩ් එක හෙවත් යූනික් නම version: 1 මේක තියෙන්නේ කෝඩ් එක අප්ඩේට් කරද්දි වර්ෂන් වශයෙන් තියාගන්න runtime: python api_version: 1 handlers: - url: / script: synditest.py - [ මේ ෆයිල් එක තමයි මුල් පිටුවට එන්නේ ] - url: /bloglist script: bloglist.py - [ RSS ඇඩ් කරන්නේ මේ ෆොම් එකෙන්] - url: /saveblog script: bloglist.py - [ ඇක්ෂන් එකක් වන saveblog ආපුවම මේ ෆයිල් එක ලෝඩ් කරන්න ] - url: /cronblogpost script: cronblogpost.py - [ ලිපි සොයා මෙහෙයුම කරන cron ෆයිල් එක ] - url: /.* script: not_found.py - [ අනවහශ්ය URL ගැහැව්වොත් මේ පිටුවට යන්න ]
2. bloglist.py මෙයා ඉන්නේ RSS ෆෝම් එකට
import cgi import datetime import urllib import wsgiref.handlers from google.appengine.ext import db from google.appengine.api import users from google.appengine.ext import webapp from google.appengine.ext.webapp.util import run_wsgi_app ඔය ඉහතින් තියන එව්වා ඔනේ හරිද """Name - wapnisyndi """ """Developer - WAP NISHANTHA SRI LANKA """ """DATE - 2011-06-05 """ මං ගැනත් සඳහනක් class Blogroll(db.Model): මේ තියෙන්නේ බ්ලොග් ලිස්ට් එකට අදලා ටේබල් එක """Models an individual Guestbook entry with an author, content, and date.""" burl = db.StringProperty(multiline=True) brss = db.StringProperty(multiline=True) bowner = db.StringProperty(multiline=True) bstatus = db.StringProperty(multiline=True) date = db.DateTimeProperty(auto_now_add=True) def blogslist_key(blogslist_name=None): """Constructs a datastore key for a Guestbook entity with guestbook_name.""" return db.Key.from_path('Blogslist', blogslist_name or 'default_blogslist') class MainPage(webapp.RequestHandler): def get(self): self.response.out.write('<html><body>') blogslist_name=self.request.get('blogslist_name') පහලින් තියෙන්නේ RSS ඉල්ලන FROM එක # Write the submission form and the footer of the page self.response.out.write(""" <form action="/saveblog" method="post"> <table border="0" cellpadding="0" cellspacing="0"> <tr> <td>Your Email</td> <td><input type="text" name="bowners" /></td> </tr> <tr> <td>Blog URL</td> <td><input type="text" name="burl" /></td> </tr> <tr> <td>Blog Rss</td> <td><input type="text" name="brss" /></td> </tr> <tr> <td></td> <td><input type="submit" value="send"></td> </tr> </table> <div></div> </form> </body> </html>""") class Blogslist(webapp.RequestHandler): def post(self): blogslist_name = self.request.get('blogslist_name') blogroll = Blogroll(parent=blogslist_key(blogslist_name)) blogroll.burl = self.request.get('burl') blogroll.brss = self.request.get('brss') blogroll.bowners = self.request.get('bowners') blogroll.put() self.redirect('/') - සයිට් එකට රිඩිරෙක්ට් කරලා දාන්න application = webapp.WSGIApplication([ ('/bloglist', MainPage), මෙතන ඉතා වැදගත් තැනක් - http://your.appspot.com/bloglist කියන url එකට මේ පිටුව ලෝඩ් කරන්න ('/saveblog', Blogslist) saveblog ඇක්ෂන් එකටත් මේ පිටුවම ලෝඩ් කරන්න ], debug=True) def main(): run_wsgi_app(application) if __name__ == '__main__': main() ඔය තියන අනික් එව්වාත් තියන්න එහෙම්ම ... මාත් තාම අලුත් නොවැ පයිතොන් වලට
3.cron.yaml මේයා ඉන්නේ අලුත් ලිපි හොයාගෙන යන වැඩේ ගුගුල් කාරයට දැනුම් දෙන්න
cron: - description: hours summary job url: /cronblogpost schedule: every 1 hours - මේ කියන්නේ පැයකට සැරයක් කියලා
4.cronblogpost.py මෙන්න වැදගත් කෙනා ලිපි හොයන් එන්න කිව්වාම මෙයා තමයි වැඩේ ගොඩ දාලා දෙන්නේ
import cgi import datetime import urllib import wsgiref.handlers import feedparser import sys import re from google.appengine.ext import db from google.appengine.api import users from google.appengine.ext import webapp from google.appengine.ext.webapp.util import run_wsgi_app """Name - wapnisyndi """ """Developer - WAP NISHANTHA SRI LANKA """ """DATE - 2011-06-05 """ පහලින් තියෙන්නේ RSS ලිස්ට් එක class Blogroll(db.Model): """Models an individual Guestbook entry with an author, content, and date.""" burl = db.StringProperty(multiline=True) brss = db.StringProperty(multiline=True) bowner = db.StringProperty(multiline=True) bstatus = db.IntegerProperty() date = db.DateTimeProperty(auto_now_add=True) def blogslist_key(blogslist_name=None): """Constructs a datastore key for a Guestbook entity with guestbook_name.""" return db.Key.from_path('Blogslist', blogslist_name or 'default_blogslist') මේ තියෙන්නේ RSS වලට ගිහින් ලිපියකින් අපි ලබා ගන්න තොරතුරු තැන්පත් කරන ටේබල් එක class Blogpost(db.Model): """Models an individual Guestbook entry with an author, content, and date.""" burl = db.StringProperty(multiline=True) ptitle = db.TextProperty() btitle = db.TextProperty() purl = db.StringProperty() bcontent = db.TextProperty() bpatas = db.StringProperty(multiline=True) brss = db.StringProperty(multiline=True) bstatus = db.StringProperty(multiline=True) pdate = db.DateTimeProperty() def guestbook_key(guestbook_name=None): """Constructs a datastore key for a Guestbook entity with guestbook_name.""" return db.Key.from_path('Guestbook', guestbook_name or 'default_guestbook') class MainPage(webapp.RequestHandler): def get(self): blogslist_name=self.request.get('blogslist_name') blogrolls = db.GqlQuery("SELECT * " "FROM Blogroll " "WHERE ANCESTOR IS :1 " "ORDER BY date DESC ", blogslist_key(blogslist_name)) ඉහත sql එකෙන් කරන්නේ Blogroll කියන ටේබල් එකේ තියන සියලු RSS ලින්ක් ගන්න එක for blogroll in blogrolls: if 1 < 2 : try: fileCount = 0 d = feedparser.parse(blogroll.brss) #print blogroll.brss n = d.feed.title.encode('utf-8') for entry in d['entries']: #print entry.title.encode('utf-8') guestbook_name = self.request.get('guestbook_name') greeting = Blogpost(parent=guestbook_key(guestbook_name)) greeting.ptitle = unicode(entry.title.encode('utf-8'), 'utf-8') greeting.burl = unicode(d.feed.link.encode('utf-8'), 'utf-8') e = d.entries[fileCount] pu = unicode(e.link.encode('utf-8'), 'utf-8') #printme( pu ) print "test" #print pu greeting.purl = unicode(e.link.encode('utf-8'), 'utf-8') #greeting.pdate = unicode(e.updated_parsed.encode('utf-8'), 'utf-8') p = re.compile(r'<.*?>') bcon = unicode(entry.description.encode('utf-8'), 'utf-8') greeting.bcontent = p.sub('', bcon) #greeting.bcontent = unicode(entry.description.encode('utf-8'), 'utf-8') greeting.btitle = unicode(n, 'utf-8') postdatetime = e.updated_parsed #print postdatetime; posted_datetime = datetime.datetime( entry['updated_parsed'][0], entry['updated_parsed'][1], entry['updated_parsed'][2], entry['updated_parsed'][3], entry['updated_parsed'][4], entry['updated_parsed'][5], entry['updated_parsed'][6],) greeting.pdate = posted_datetime print "1" guestbook_name=self.request.get('guestbook_name') q = db.GqlQuery("SELECT * FROM Blogpost WHERE purl = :1", pu) #q = Blogpost.all() #q.filter("purl =", pu) #q.order("-pdate") results = q.fetch(1) if results: for p in results: print "%s inches tall" % (p.purl) else: print "empty" greeting.put(); print pu fileCount += 1 print " 2" except Exception: pass ඊට පස්සේ තියෙන්නේ ඔය උඩින් බ්ලොග් අඩවියක RSS කියවලා, අලුත් ලිපි තියනවා නම් එවා Blogpost කියන ටේබල් එකට දාගන්න විදිහ. මේ මමකරපු විදිහ. තව ලේසි ක්රම පහසු ක්රම තියෙන්න පුලුවන්. එහෙම තියනවා නම් මාවත් දැනුවත් කරන්න ඇ application = webapp.WSGIApplication([ ('/cronblogpost', MainPage) ], debug=True) def main(): run_wsgi_app(application) if __name__ == '__main__': main()
5.synditest.py මෙයා තමයි හොයන් ආපු ලිපි වෙන්වන කෙනා
from google.appengine.ext import db from google.appengine.ext import webapp from google.appengine.ext.webapp.util import run_wsgi_app """Name - wapnisyndi """ """Developer - WAP NISHANTHA SRI LANKA """ """DATE - 2011-06-05 """ import os from google.appengine.ext.webapp import template ලිපි තියන ටේබල් එක class Blogpost(db.Model): """Models an individual Guestbook entry with an author, content, and date.""" burl = db.StringProperty(multiline=True) ptitle = db.TextProperty() btitle = db.TextProperty() purl = db.TextProperty() bcontent = db.TextProperty() bpatas = db.StringProperty(multiline=True) brss = db.StringProperty(multiline=True) bstatus = db.StringProperty(multiline=True) pdate = db.DateTimeProperty() def guestbook_key(guestbook_name=None): """Constructs a datastore key for a Guestbook entity with guestbook_name.""" return db.Key.from_path('Guestbook', guestbook_name or 'default_guestbook') class MainPage(webapp.RequestHandler): def get(self): guestbook_name=self.request.get('guestbook_name') q = db.GqlQuery("SELECT * FROM Blogpost ORDER BY pdate DESC LIMIT 100") දිනෙන් පිළිවෙල කරලා ලිපි සීයක් ගැනිම template_values = { 'greetings': q } path = os.path.join(os.path.dirname(__file__), 'index.html') self.response.out.write(template.render(path, template_values)) මෙතන කරලා තියෙන්නේ වෙනම තියන HTML ෆයිල් එකකට ඩේටා යවන්න එක. application = webapp.WSGIApplication([ ('/', MainPage) ], debug=True) def main(): run_wsgi_app(application) if __name__ == '__main__': main()
6. index.html මේක තියෙන්නේ ඉහත පහේ තියන එකට සපෝට් විදිහට තියන ටෙම්ප්ලෙට් එකක් විදිහට
<html> <head> <title>wapnisyndi</title> <style> </style> </head> <body> {% for greeting in greetings %} {% if greeting.burl %} <a href="{{ greeting.purl }}" class="">{{ greeting.ptitle }}</a> | <a href="{{ greeting.burl }}" class="">{{ greeting.btitle }}</a> | {{ greeting.pdate }} {% else %} An anonymous person wrote: {% endif %} <div class="">{{ greeting.bcontent }} ... <a href="{{ greeting.purl }}" class="">වැඩිදුර >></a></div> <hr /> <div> {% endfor %} </div> </body> </html>
7. not_found.py - මේ අනවශ්ය url එකක් ගැහැව්වොත් එන ෆයිල් එක
"""Name - wapnisyndi """ """Developer - WAP NISHANTHA SRI LANKA """ """DATE - 2011-06-05 """ print "not found"
8.feedparser.py මේක තුන් වන පාර්ෂවිය ලයිබ්ර්රි එකක් මෙතනින් ගන්න ඒක
හරි ඔච්චර තමයි. මේක තව ටිකක් වැඩි දියුණු කරගන්න. සම්පූර්ණ කෝඩ් එක මෙතනින් භාගන්න. මේ කෝඩ් එක භාවිතයෙන් හදපු සින්ඩියක් මෙන්න
ඉහත කෝඩ් වලම සිංහලෙන් ලිව්වේ පැහැදිලි වෙන්න. නමුත් සම්පූර්ණ කෝඩ් එක භාගත්තාම එහෙම පැහැදිලි කිරිම් නැහැ. ඔබත් ඔබටම කියා සින්ඩියක් හදාගන්න.
ටෙක්නිකල් දේවල් එපා නම් මේ පහත ලිපි බලන්න
1. ත්රිපිඨකය තුල සිංහලෙන් , ඉංග්රීසියෙන් සහ පාලියෙන් සෙවීම් සිදුකල හැකි පරිගණක මෘදුකාංගයක්
2. තරු මෙච්චර ආතල් ද????
3. නුඹ රහසින් ඇවිත්......
4. සිංහල බ්ලොග් වලට පුංචි තල්ලුවක්...මං කියවන බ්ලොග්...
5. ඔබ දන්නවද ලංකාවේ තියන කෝච්චි මොනවද කියලා
6. ආදරබර Network එක හෙවත් ගල් කොරියේ ලවු එක .
O.o මේ ටික ලිව්වද බන්
ReplyDeleteමමත් මේ තාම පයිතන් හරියට අල්ල ගන්න ට්රයි කරනවා :D
මොනවා උනත් එල ලිපිය, හිතුනොත් ලියන්න ඕනේ ඇප්ස්පොට්ටා ගැන ලිපියක්
අම්මප කාලෙකින් වැදගත් දෙයක් ලියල :D
ReplyDeleteදැන් එතකොට ඔය පයිතන් අපිව කෑවොත්?
ReplyDeleteකෝබ්රා වලින් බැරිද ඔය වැඩේ කරන්න?
දැනුවත් කිරීම සම්බන්ධව ස්තුතිය ...............
ReplyDeleteහැබැයි මන්ඤ්න්වගේ ( අපගේ නොදැනුවත් බාවය නිසා )
මමත් එකක් හදන්න ඕන...කුප්පා සිංඩි...
ReplyDelete:)
අනේ අපි පොඩි උන් වැප් අංකල්
පයිතන් ඉගෙනගන්න ආස හිතෙනවා මේ ලිපිය කියෙව්වම..
ReplyDeleteබොහොම ස්තුතියි!
කතන්දර, වැප් කියන්නෙ මහ පයිතන් කෙනෙක්. ඒකයි ඔය බයනැතුව අතගහලා තියෙන්නෙ.......
ReplyDeleteබොහෝම ස්තූතියි අය්යා,ඔක්කොම නම් තේරුනේ නෑ.ඒත් පොඩි අයිඩියා එකක් තියනව දැන්.
ReplyDeleteමට වතුර ටිකක් දීයං..තාම කැරකෙනවා වගේ...
ReplyDeleteඅනේ ඔය පයිතන් ගැනනං මං දන්නේ නැහැ..සින්ඩි හදන්න මට තේරෙන්නෙත් නැහැ..කොහොම හරි හෙට අනිද්දට බ්ලොග් වලට වඩා සින්ඩි බිහි වෙයිද මංදා..? ඒකත් හොදා...
අනේ පින් ඇති කෙනෙක් මටත් සින්ඩියක් හදා දීහල්ලා...
ඒ කොඩ් ටික දැක්කාම පිස්සු හැදෙනවා තමා. මීට වඩා Wordpress syndi ලේසි. මම හිතන්නේ මාත් ගිය සතියේ සිංඩියක් හදන හැටි ලිපියක් ලිව්වා http://panhidaa.blogspot.com/2011/06/blog-post.html
ReplyDeleteඅකුරක් වත් නොදන්න අපිට පයිතන් ගැන හිතන්න දෙයක් වැප් අය්යා ලියලා තියෙන්නේ
ReplyDeleteඑත් ඉතින් මෙහෙම කියලා දෙන එක හොද වුනත් මම හිතන්නේ හැමොම සින්ඩි හදන්න ගියොත් ඒක ඒ තරම් හොද දෙයක් නෙමේ.. හැමොම හොද තැන් දෙක තුනක විතරක් උන්නහම තමයි හොද දෙයක් කරන්න පුලුවන් මම හිතන්නේ
නැත්නම් ලංකාවේ දෙශපාලන පක්ශ වගේ පදුරක් පදුරක් ගානේ සින්ඩි හැදුනට සමහර පක්ෂ වලට ඒ පක්ෂේ නායකයොත් චන්දේ දෙන්නේ නැ වගේ තමන්ගේ සින්ඩියට තමන්ගේ බ්ලොග් එක දාගෙන බල බල තමා ඉන්න වෙන්නේ (අනේ මේ මට හිතුන දේ වැරදිනම් සොරි කිවා) තියන ඒවා තවත් දියුනු කරන් මේක ඉස්සරහට යනවටයි මම කැමති
අනේ මටනම් බෑ සින්ඩි හදන්න.. :)
ReplyDeleteට්රයි කරන්න ඕනේ. පයිතන් ගැනනම් මෙලෝ දෙයක් දන්නේ නෑ. ගූගල් දෙයියන්ගෙන් අහලා පයිතන් ගැන විස්තර ටිකක් දැනගෙනම වැඩේට බහින්න ඕනේ.
ReplyDeleteටෙක්නිකල් බ්ලොග් කොච්චර තිබ්බත් ගොඩක් ඒවයේ ලියන්නේ හැමෝම දන්න ඒවා. ඉතින් ඒවා වැඩිය කවුරුත් බලන්නේ නෑ. වැපා උඹ හැමදාම ටෙක්නිකල් ලිපි විතරක් ලියපන් බං.
මම පයිතන් ඉගනගන්න ගමන් . ඉතින් වැප් ලොක්කා දීපු මේ ලිපිය මට රටක් වටී .
ReplyDeleteසින්ඩි හදන්න නම් මට බෑ ..ඒත් පයිතන් ජුංඩක් ඉගන ගන්න මේක යන්තම්වත් ඉවහල් වේවි
This comment has been removed by the author.
ReplyDeleteමම ඉතින් බැංකු යනවා කිව්වට දවසින් බාගයක් ලාංකීය සිතුවිලි වලට කඩේ යන්නේ. මම ඔය උඩ කියලා තියෙන්නේ. හත්මාලුව ගැන කට්ටිය වැරදියට එහෙම හිතන්න එපා. මම ගියෝ....................................
ReplyDeleteබ්ලොග් තරමට සින්ඩි එන කාලේ උබ තවත් සින්ඩි පුරවන්න යන්නේ,,අනේ මේ අපි මේවා බලාගෙන ඉන්නම් පයිතන්ලව ආශ්රය කරන්න බෑ බන් මෙලෝ දෙයක් තේරුනේ නෑ
ReplyDeleteවැපෝ ආසාවේ බෑ බං...
ReplyDeleteඑල එල. Java පාදක කරගෙන ගූගල් වල වෙබ් සයිට් හොස්ට් කිරිම ලිපිය කියවල මාත් ගූගල් වල වෙබ් සයිට් එකක් හොස්ට් කලා.
ReplyDeleteහොඳ ලිපියක් වැප් සහෝදරයා.බොහෝම ස්තුතියි.මමත් පයිතන් එක්ක වැඩිය සෙල්ලම් දාල නෑ.ඒත් අත්හදා බලන්න ඕනා වෙලාවක් හම්බඋනාම. වර්ඩ්ප්රෙස් වලින් වගේම ජූම්ලා,ඩෘපාල් වල ඇග්රිෙග්ර්ටර් සමඟිනුත් මේ දේ කරන්න පුලුවන් නේද?
ReplyDeleteමම ෆීඩ් වරඩ්ප්රෙස් පාවිච්චි කරලා වර්ඩ්ප්රෙස් වලින් නම් පොඩි ටෙස්ට් සින්ඩිකේටරයක් හදලා තියනවා....
http://tirthayathrava.blogspot.com/2010/07/blog-post.html
@තීර්ථ
ReplyDeleteඔව් ඔය කියපු හැම එකින්ම කරන්න පුලුවන්. ඒත් සර්වර් එක සපෝට් කරන්න ඔනේ. එහෙම නැත්නම් කරන්න අමාරුයි. cron දුවන වැඩේ
නොතේරුණාට කමක්... ඔහොම යං....
ReplyDeleteඔව් ගොඩක් ෆී සර්වර් වල ක්රොන් ටැබ් එක එඩිට් කරන්න දෙන්නෙ නැති නිසා ඒවට නම් ෆීඩ් වර්ඩ් ප්රෙස් හොඳ විකල්පයක්.කිව්වත් වගේ සර්වරේ සපෝට් කලේ නැත්තං මොනවත් කරන්න බෑ නොවැ..
ReplyDeleteඔයි පයි-තං මට තේරෙන්නෙ නෑ බොලං. ඒත් ඉතිං බොහෝම බර සාර ලිපියක් නොවැ. තේරෙන එවුන් ස්තූතියි කියාපල්ල. මං කටපියාගත්ත ඕං.
ReplyDeleteඅයියලගෙ සිංඩි තියෙද්දි තව එවා මොනාටද?මෙහෙම ගියොත් සිංඩි වලටත් සිංඩි හදන්න වෙවි!හික්ස්
ReplyDeleteපයිතන් නම් අතගහලා නෑ , නමුත් මෙක දැක්කහම ට්රයි එකක් දෙන්නත් හිතෙනවා ....
ReplyDeletepython , java SDK වලට අමතරව "Go" ත් google ලා සපෝර්ට් කරනවා , එකේ api එක පොඩ්ඩක් බෑලුවා , python වලට වඩා ලෙහෙසි වගේ ....
http://golang.org/doc/go_tutorial.html
ඔව් මාත් දැක්කේ පස්සේ Go ගැන .... ඒක ලේසි වෙන්න ඔනේ පයිතන් වලට වඩා දෙයියන්ගේ වැඩක් හින්දා :DDD
ReplyDeleteමෙහෙම කියල දෙන අය ඉන්න එක කොච්චර හොඳද ? එත් මන් වාගේ ටියුබ් ලයිට් වලට ඉතින් වැඩක් නැහැ. බ්ලොග් එක ලියාගන්නෙත් කොච්චර දඟලලාද ? හික් ..
ReplyDeleteහපොයි මේ තියන බ්ලොග් එකම ඇති. මොන සිංඩිද?
ReplyDeleteඅනික ඕවා හදන්න පටන්ගත්තොත් බ්ලොග් ලියන උන් නැති වෙනවා බොල....
මගේ බ්ලොග් ගුරාට ජයවේවා !!! (වැපා)