פורסם: 21/03/2009 - 20:00
נושא ההודעה: שאלה מישהו יכול לעזור עם קוד פיתון וJINJA
|
שלום לכולם .
קוד: |
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
|
יש לי חוסר הבנה בקוד הנ"ל
מה זה your application
חשבתי שזה תכנית הפיתון שלי אבל לא
חשבתי שזה אוביקט של הHTTPSERVERREQUEST
ואני לא מצליח לעבור את השלב הזה
דרך אגב בניתי BASICHTTPSERVER והוא אמור להעביר לJINJA את הREQUEST OBJECT
כדי שJINJA ירנדר לשם תגים מסוימים .
הסרוור עולה בסדר ונותן RESPONSE בסדר אבל אני לא מצליח לסדר את JINJA
שיכנס לי בין הREQUEST ל RESPONSE
|
|
חזרה לתוכן הדיון |
פורסם: 21/03/2009 - 21:06
נושא ההודעה:
|
קודם כל תשים לב שהוא מצפה ל string ככה שאין מה לתת לו אובייקטים אחרים.
אני מניח ש yourapplication זה ה import-path של האפליקציה שלך ו templates זה השם של מחיצת ה templates שלך בתוך אותה החבילה. זה לפחות מה שהבנתי מהדוקומנטציה בלי להפעיל את זה.
לגבי השאלה השניה, בלי קוד לדוגמא קשה להבין מה אתה רוצה, מה יוצא בסוף ולמה אתה מצפה.
|
|
חזרה לתוכן הדיון |
פורסם: 22/03/2009 - 01:20
נושא ההודעה:
|
import path ב פיתון ?
אף פעם לא נדרשתי לספק דבר כזה ואין לי מושג
איפה זה נמצא.
קוד: |
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from jinja2 import Environment, PackageLoader
if __name__ == '__main__':
self.env = Environment(loader=PackageLoader('/home/yair/Desktop/httpserverProject/', '/home/yair/Desktop/httpserverProject/'))
self.env = Environment(loader=PackageLoader('line_statement_prefix="#", variable_start_string="${", variable_end_string="}"', '/home/yair/Desktop/httpserverProject/'))
self.template = self.env.get_template('ksFetch.html')
self.template.render(cheque='10,000')
print self.template.render(the='variables', go='here')
|
גורם לבעית:
File "/usr/lib/python2.5/site-packages/pkg_resources.py", line 160, in get_provider
__import__(moduleOrReq)
ImportError: No module named /home/yair/Desktop/httpserverProject/
|
|
חזרה לתוכן הדיון |
פורסם: 22/03/2009 - 11:09
נושא ההודעה:
|
|
|
חזרה לתוכן הדיון |
פורסם: 22/03/2009 - 21:08
נושא ההודעה:
|
עובד אין לי מילים תודה רבה רבה רבה
|
|
חזרה לתוכן הדיון |
פורסם: 22/03/2009 - 22:43
נושא ההודעה:
|
יש מצב ש basicHttpServer של פיתון לא תומך בUNICODE
אני משתמש ב
# -*- coding: utf-8 -*-
קוד: |
HttprequestHandler.wfile.write(template.render(cheque=u'ש10000')) #failed !
HttprequestHandler.wfile.write(template.render(cheque=u'10000')) #succeed
|
|
|
חזרה לתוכן הדיון |
פורסם: 23/03/2009 - 01:23
נושא ההודעה:
|
א. utf-8 זה לא יוניקוד, זה subset שלו
ב. אין קשר בין מה שאתה שם ב-coding (אשר מציין את קידוד הקוד) לקידוד המיוצר בסופו של דבר. אתה אחראי ע"י שליחת header מתאים, או ציון הקידוד בעמוד המיוצר ע"י תג המטא המתאים.
|
|
חזרה לתוכן הדיון |
פורסם: 23/03/2009 - 10:46
נושא ההודעה:
|
יש לי בעית EXCEPTION של פיתון
אני מקבל EXCEPTION בwfile.write שאני מעביר יוניקוד זו מתודה של HTTPSERVERREQUEST
תג המטה בHTML זו לא הבעיה.
|
|
חזרה לתוכן הדיון |
פורסם: 23/03/2009 - 19:27
נושא ההודעה:
|
מה זה הג'ינג'י הזה? ספריה למה?
|
|
חזרה לתוכן הדיון |
פורסם: 23/03/2009 - 20:16
נושא ההודעה:
|
אז יכול להיות שהוא לא יודע לטפל ביוניקוד (אשר שונה מסתם מחרוזת) ומאחר והוא מנסה לבצע המרה למחרוזת, וקידוד ברירת המחדל למחרוזת עבור ענף 2 הוא ascii, זה נכשל.
לכן המר יזום ל-utf-8:
קוד: | wfile.write(my_uniocde_object.encode('utf-8')) |
כמו כן ישנה אפשרות לפתוח קבצים עם קידוד מראש, כך שהמרה מתבצעת אוטומטית בעת קריאה/כתיבה (ע"י codecs.open) אך אם אתה מקבל כבר מראש את אובייקט הקובץ (כמו שנראה במקרה שלך) אולי תוכל להשתמש ב-codecs.EncodedFile אשר עוטף קובץ פתוח בצורה דומה.
|
|
חזרה לתוכן הדיון |
פורסם: 24/03/2009 - 21:51
נושא ההודעה:
|
snir : | מה זה הג'ינג'י הזה? ספריה למה? |
ספריה לרנדור טמפלטים (משתמשים בזה בעיקר לHTML) אבל גם טקסט קביל
|
|
חזרה לתוכן הדיון |
פורסם: 24/03/2009 - 23:19
נושא ההודעה:
|
mksoft : | אז יכול להיות שהוא לא יודע לטפל ביוניקוד (אשר שונה מסתם מחרוזת) ומאחר והוא מנסה לבצע המרה למחרוזת, וקידוד ברירת המחדל למחרוזת עבור ענף 2 הוא ascii, זה נכשל.
לכן המר יזום ל-utf-8:
קוד: | wfile.write(my_uniocde_object.encode('utf-8')) |
כמו כן ישנה אפשרות לפתוח קבצים עם קידוד מראש, כך שהמרה מתבצעת אוטומטית בעת קריאה/כתיבה (ע"י codecs.open) אך אם אתה מקבל כבר מראש את אובייקט הקובץ (כמו שנראה במקרה שלך) אולי תוכל להשתמש ב-codecs.EncodedFile אשר עוטף קובץ פתוח בצורה דומה. |
באנה MKSOFT בלעדיך הדמו לא היה קם לתחייה אתה גדול מהחיים
ומאחר ועזרת לי המון אני מדביק פה את הדמו שלי לנוחיות כולם
ומשחרר את הקוד שלי תחת GPL גרסה 3
ולחברה אתם צריכים להדביק את הקוד בDESKTOP שלכם
לטמפלט לתת את השם template.html לקוד הפיתון תנו משהו כמו server.py
להתקין את ספריית JINJA2 ולהריץ את הקוד תחת python server.py
בהצלחה למי שיעזר בקוד.
קוד: |
#!/usr/bin/env python
#-*- coding: utf-8 -*-
#################################################################################
# COPYRIGHT © 2009 BY YAIR LIBERMAN ("THE AUTHOR") ALL RIGHTS RESERVED #
# ON THE BEHALF OF HTTP:\\WWW.WAHTSUP.CO.IL WITH HELP FORM MKSOFT #
# THIS PROGRAM IS AN EXAMPLE HOW TO BUILD SIMPLE INTERNET APPLICATION SERVER #
# USING PYTHON ENVIRONMENT ONLY AND JINJA2 LIBRARY AS A RENDERER FOR HTML #
# TEMPLATES #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program. If not, see <http://www.gnu.org/licenses/>. #
################################################################################
import os
import BaseHTTPServer
from jinja2 import Environment,FileSystemLoader,Markup
class HttpDeamon():
def __init__(self):
self.host = '' # !!!REMEMBER TO CHANGE THIS!!!
self.port = 8000 # Maybe set this to 9000.
self.server_class = BaseHTTPServer.HTTPServer
self.httpd = self.server_class((self.host, self.port), MyHandler)
print "SERVER RUNNING ON PORT:"+str(self.port)
try:
self.httpd.serve_forever()
except KeyboardInterrupt:
pass
self.httpd.server_close()
class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(s):
"""Respond to a GET request."""
s.send_response(200)
s.send_header("Content-type", "text/html;charset=utf-8")
s.end_headers()
path=''
path=os.environ.get('HOME')
path=path+'/Desktop/'
env = Environment(loader = FileSystemLoader(path))
template = env.get_template('template.html')
s.wfile.write(template.render(cheque=u'1000שח').encode('utf=8'))
if __name__ == '__main__':
os.system("firefox localhost:8000 &")
HttpDeamon()
|
קוד: |
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.r {font-family: miriam;font-size:16px}
.s {font-family: david;font-size:14px;font-weight:bold}}
.dd {font-family: arial;font-size:18px;font-weight:bold}}
h1 {color: red}
h3 {color: blue}
</style>
<Script Language="JavaScript">
</Script>
</head>
<body bgcolor="#6699FF" text="black">
<DIV dir=RTL>
<input type="radio" name="radio1" value="all" tabindex="1" checked> הכל
<input type="radio" name="radio1" value="future"> עתידי
<input type="radio" name="radio1" value="history"> הסטורי
<br>
<b class="r">שם לקוח</b>
<INPUT class="s" type="text" name="text1" size="10" maxlength="10" tabindex="4">
<b class="r">טלפון לקוח </b>
<INPUT class="s" type="text" name="text2" size="10" maxlength="10" tabindex="5">
<HR>
<TABLE width=700 border=1 cellspacing=5 cellpadding=3>
<TR>
<TD width=100>תאריך עסקה</TD>
<TD width=140>סכום עסקה</TD>
<TD width=360>שם לקוח</TD>
<TD width=100>תאריך שני</TD>
</TR>
<TR>
<TD>15/01/2009</TD>
<TD>{{cheque}}</TD>
<TD>לישה הכהן ראובן וסימיון </TD>
<TD>29/02/2009</TD>
</TR>
</TABLE>
</div>
</body>
</html>
|
|
|
חזרה לתוכן הדיון |
פורסם: 25/03/2009 - 14:13
נושא ההודעה:
|
ציטוט: |
באנה MKSOFT בלעדיך הדמו לא היה קם לתחייה אתה גדול מהחיים |
לא סתם הוא מנהל פה את הענינים...אחד החבר'ה היותר מקצועיים שנמצאים בשוק ועם סבלנות לעזור לאחרים..
|
|
חזרה לתוכן הדיון |
פורסם: 26/03/2009 - 13:31
נושא ההודעה:
|
תודה, אך אין צורך להסחף, כולה תבנית.
queency: מספר הערות מקריאה זריזה (לגבי הקוד, על ה-html אפשר לדבר אח"כ):
- הדרך שאתה בודק את תיקיית הבית היא לא פורטיבילית (לדוגמא: על חלונות לא יעבוד). לכן עדיף:
קוד: | home = os.getenv('USERPROFILE') or os.getenv('HOME') |
- כך גם הדרך שאתה מחבר את התיקיות, היא עשויה להיות בעייתית. עבור זה יש את os.path.join, שגם תדאג להבדלים בין מערכות הפעלה. אם ניקח את תיקיית הבית מהסעיף הקודם:
קוד: | path = os.path.join(home, 'Desktop') |
- הפעלה בעייתית של הדפדפן (יכול להיות שאצל אחרים הוא כלל לא ברירת המחדל, או שאף לא מותקן). לפייתון יש ספריה בשם webbrowser המטפלת בשליטת דפדפן:
http://docs.python.org/library/webbrowser.html
- אתה מחשב path, יוצר והורס Environment בכל בקשת GET, זה לא יעיל, עדיף לעשות את זה פעם אחת מחוץ ל-do_GET.
|
|
חזרה לתוכן הדיון |
פורסם: 27/03/2009 - 16:53
נושא ההודעה:
|
אתה יותר מצודק בכל אחת מהערותך
פשוט עבר יותר מחודש עד שהצלחתי בעזרתך להגיע לקוד הזה שפשוט עובד.
אז הייתי כל כך מאושר שפשוט שחררתי אותו מבלי לעשות פינישים ראויים.
הPATH זה כמובן איום ונורא .
לגבי BROWSER שכחתי שיש עוד דפדפנים לרגע אתקן זאת.
לגבי OS טוב זה באמת רק מומחים יעלו על המתודה הנכונה תודה מראש.
לגבי מולטי פלטפורם אני חושב שיהיה לי בעיה יותר גדולה להתקין את JINJA על וינדוס
כי אני לא יודע לעשות את זה ידנית.
שוב תודה עזרת לי ועשית אותי מאושר לפחות עד האתגר הבא.
|
|
חזרה לתוכן הדיון |
פורסם: 28/03/2009 - 14:49
נושא ההודעה:
|
המטרה כמובן היא שאנשים יכירו יותר כלים מהספריה הסטנדרטית ויעבדו נכון (os.path.join זו פעולה די בסיסית ונפוצה).
לגבי jinja2 על חלונות: מתקינים באופן דומה, עם easy_install, יש כבר חבילות מהודרות מראש לגרסאות פייתון שונות.
|
|
חזרה לתוכן הדיון |
|