Zápis do souboru – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zápis do souboru – Python – Fórum – Programujte.comZápis do souboru – Python – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
15. 12. 2011   #1
-
0
-

Zdravím,

mám problém se zápisem do souboru. Mám vytvořit skript, který do určitého souboru zapíše IP adresu klienta, jméno doménového počítače klienta a jméno, které vyplnil do formuláře. Celé to pracuje se zcela primitivním formulářem o jednom políčku a mě zajímá, jak zapíšu do pythonu kód, aby mi do souboru vypsal požadované věci.

#!/usr/bin/python
import cgi
import os
import cgitb
cgitb.enable()
print 'Content-type: text/html'
print 
print "<h1>Ahoj</h1>"
cgi.print_environ()

print "odkud:", os.getenv("REMOTE_ADDR"), os.getenv("REMOTE_HOST")

form = cgi.FieldStorage()

# nahore je kod ze cviceni, zde jen pro ilustraci
# smerem dolu zapis do souboru, nevim jak to cele napsat, aby zapisovalo spravne, zatim zapisuje pouze ty casti hned za f.write, tzn: "IP adresa klienta: ", "domenove jmeno pocitace klienta: ", "jmeno zadane do pocitace: "

f = open('log.txt', 'a')
f.write("IP adresa klienta: "), os.getenv("REMOTE_ADDR")
f.write("domenove jmeno pocitace klienta: "), os.getenv("REMOTE_HOST")
f.write("jmeno zadane do pocitace: "), os.getenv("QUERY_STRING")
f.write("\n")
f.close()

Doufám, že jsem problém popsal srozumitelně, snad se najde někdo, kdo pomůže. :)

Nahlásit jako SPAM
IP: 90.178.30.–
zlz
~ Anonymní uživatel
634 příspěvků
15. 12. 2011   #2
-
0
-

   

f.write("IP adresa klienta: ")
f.write(os.getenv("REMOTE_ADDR"))

f.write("IP adresa klienta: " + os.getenv("REMOTE_ADDR"))
Nahlásit jako SPAM
IP: 213.211.51.–
15. 12. 2011   #3
-
0
-

#2 zlz
Něco podobnýho už jsem zkoušel a pokaždý mi to vyhodí tuhle chybu:

Traceback (most recent call last):
  File "cesta/soubor", line 18, in <module>
    f.write(os.getenv("REMOTE_ADDR"))
TypeError: expected a character buffer object

Nahlásit jako SPAM
IP: 90.178.30.–
zlz
~ Anonymní uživatel
634 příspěvků
15. 12. 2011   #4
-
0
-

Tak ta proměnná asi neexistuje (což je u CGI divné). Druhým parametrem getenv můžeš určit, jaká hodnota se v takovém případě má vrátit.

f.write(os.getenv("REMOTE_ADDR", "<nedefinovano>"))
Nahlásit jako SPAM
IP: 213.211.51.–
15. 12. 2011   #5
-
0
-

V tom případě si nejsem jist co mám do dalšího parametru zadat. Vrátí mi to přímo text, který tam napíšu, ale to já samozřejmě nechci.

Určitě by to mělo fungovat tak, jak je výše uvedeno? Tedy:

f.write("IP adresa klienta: ")
f.write(os.getenv("REMOTE_ADDR"))

f.write("IP adresa klienta: " + os.getenv("REMOTE_ADDR"))

Pokud ano, tak se nebudu bát to odevzdat jako správné řešení.

Nahlásit jako SPAM
IP: 90.178.30.–
zlz
~ Anonymní uživatel
634 příspěvků
15. 12. 2011   #6
-
0
-

Ty to spouštíš jako normální program u sebe, viď? CGI skripty jsou určené ke spouštění přes webserver, tam ty proměnné budou nastavené a getenv bude vracet jejich hodnotu. Ten druhý parametr tam nech.

Nahlásit jako SPAM
IP: 213.211.51.–
15. 12. 2011   #7
-
0
-

#6 zlz
takže tam nechat přímo "<nedefinovano>" ?

ano spouštím to v Pythonu pomocí F5, protože ten html soubor s formulářem, když spustím u sebe, tak mi zobrazí stránku se zdrojákem v pythonu.

Adresa, přes kterou jinak spouštím formulář odkazuje na *.cgi soubor, který je uložen ve škole, tudíž ho nemůžu změnit a žádných výsledků se nedočkám (a do školy se tento týden už nedostanu :D).

Takže velmi pěkně děkuji za radu, budu doufat, že máš pravdu a odevzdám to takhle.

Nahlásit jako SPAM
IP: 90.178.30.–
zlz
~ Anonymní uživatel
634 příspěvků
15. 12. 2011   #8
-
0
-

Ne nutně zrovna "<nedefinovano>", třeba prázdný řetězec "". Jen pro jistotu, aby tam něco bylo a náhodou to zase nehodilo chybu.

A v Pythonu jde jednoduše udělat CGI server. Toto si ulož a spusť. Ve stejné složce vytvoř složku cgi, hoď do ní ten svůj pokus a na http://localhost:8080/ můžeš testovat.

import os
import CGIHTTPServer
import BaseHTTPServer

class Handler(CGIHTTPServer.CGIHTTPRequestHandler):
    cgi_directories = ["/cgi"]
    def is_cgi(self):
        if os.path.isdir(self.translate_path(self.path)):
            return False
        return CGIHTTPServer.CGIHTTPRequestHandler.is_cgi(self)

httpd = BaseHTTPServer.HTTPServer(("", 8080), Handler)
httpd.serve_forever()
Nahlásit jako SPAM
IP: 213.211.51.–
zlz
~ Anonymní uživatel
634 příspěvků
15. 12. 2011   #9
-
0
-

Jo a musí to mít příponu .py (ne .cgi).

Nahlásit jako SPAM
IP: 213.211.51.–
15. 12. 2011   #10
-
0
-

Dobře, díky moc, dost možná jsi mě právě připustil ke zkoušce :)

Nahlásit jako SPAM
IP: 90.178.30.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

Zápis do souboru — založil Earl Cash

Zapis do souboru — založil Ondřej Karanský

Zápis do souboru — založil Martin

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý