2012-04-24 2 views
0

У меня есть сценарий входа в систему python, в котором я хочу взять имя пользователя и пароль и передать его другому скрипту python, который проверяет имя пользователя и пароль со значениями в базе данных , Если пользователь существует, он создаст файл cookie с именем пользователя, установленным в файле cookie, и перенаправит его на следующую страницу, иначе он вернет его на предыдущую страницу.Перенаправить скрипт python в другой скрипт python для проверки учетных данных для входа

это мой index.py код:

#!/usr/bin/python 
import cgi; 
import cgitb; 
import sqlite3; 
import os; 
import Cookie; 
import sys; 



cgitb.enable() 
form= cgi.FieldStorage() 
username= None 
userID = None 
userPW= None 

#Open connection 
conn= sqlite3.connect("manager.db") 
cur= conn.cursor() 





def createdb(): 
    ###Create table login 
    conn.execute(""" CREATE TABLE login (userid INTEGER PRIMARY KEY , 
    username TEXT, passwrd TEXT)""") 
    ## 
    ###Create table excursion 
    conn.execute(""" CREATE TABLE excursion (excurid INTEGER PRIMARY KEY, 
    location TEXT, excurDate TEXT, excurTime TEXT, user INTEGER, FOREIGN KEY(user) REFERENCES login(userid))""") 
    ## 
    #Create table sighting 
    conn.execute(""" CREATE TABLE sighting (sightid INTEGER PRIMARY KEY, 
    species TEXT, observation TEXT, loginuser INTEGER, userexcursion INTEGER, FOREIGN KEY(loginuser, userexcursion) REFERENCES excursion (user, excurid))""") 
    ## 
    #Insert username and password in login table 
    conn.execute("""INSERT INTO login (userid,username,passwrd) VALUES(NULL,'Diego','diego')""") 
    conn.commit() 

    #Insert dummy data in excursion table 
    conn.execute("""INSERT INTO excursion (excurid,location,excurDate,excurTime,user) VALUES(NULL,'Macquarie','04/01/2012','6:00pm',1)""") 
    conn.execute("""INSERT INTO excursion (excurid,location,excurDate,excurTime,user) VALUES(NULL,'Carlton','04/05/2012','7:00am',1)""") 
    conn.commit() 

    #Insert dummy data in sighting table 
    conn.execute("""INSERT INTO sighting (sightid,species,observation,loginuser,userexcursion) VALUES(NULL,'Duck','long beak',1,1)""") 
    conn.execute("""INSERT INTO sighting (sightid,species,observation,loginuser,userexcursion) VALUES(NULL,'Parrots','beautiful and colorful',1,2)""") 
    conn.commit() 
    conn.close()  



if not os.path.exists("manager.db"): 
    createdb(); 

#define start of page 
pagehead1= """ 
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd"> 
    <html> 
    <head> 
     <title> Home </title> 
     <link rel='stylesheet' type='text/css' href='/index.css/'/> 
    </head> 

    <body> 
""" 

pagehead2=""" 

     <form method=POST action="http://localhost:8000/cgi-bin/validate.py"> 
      <div id="container"> 
       <div id="header"> 
        <h1> Field Note Manager </h1> 
        <p class= "description"> Observe...Record...Save! </p> 
       </div> 

       <div id="wrapper"> 
        <div id="content"> 
         <p> Username: <input type="text" name="usernameLogin"/> </p> 
         <br/> 
         <p> Password: <input type="password" name="passwordLogin"/> </p> 
         <br/> 
         <p id="login"> <input type="submit" name="loginBtn" value="Login"/> </p> 
        </div> 
       </div> 

       <div id="footer"> 
        <p> Copyright 42578647, 2012 </p> 
       </div> 
      </div> 
    """ 

pagefoot= """ </form> 
        </body> 
        </html> """ 

print "Content_type: text/html\n\n" 
print pagehead1 
print pagehead2 
print pagefoot 

и это мой код для проверки имени пользователя с базой данных:

#! usr/local/bin/python 
import cgi; 
import cgitb; 
import Cookie; 
import os; 
import sqlite3; 

#open connection 
conn= sqlite3.connect("manager.db") 
cur= conn.cursor() 

username= None 
form= cgi.FieldStorage() 

UserPW= [form.getvalue('usernameLogin'), form.getvalue('passwordLogin')] 
isValidate = validate(UserPW); 

if isValidate == 1: 
    print "Content_type: text/html\n\n" 
    print """ 
    <html> 
     <head> Redirecting </head> 
     <body> 
      <form method= POST action="http://localhost:8000/cgi-bin/page1.py"> 
      <p> Validated! <input type="submit" value="Enter"/> </p> 
      </form> 
     </body> 
    </html> """ 
elif isValidate == 0: 
    print "Content_type: text/html\n\n" 
    print """ 
    <html> 
     <head> Redirecting </head> 
     <body> 
      <form method=POST action= "http://localhost:8000/cgi-bin/index.py"> 
       <p> Username or Password incorrect! <input type="submit" value="Go back"/> </p> 
      </form> 
     </body> 
    </html> 
    """ 



def validate(UserPW): 
    sql= "SELECT * FROM login" 
    userPWDatabase=cur.execute(sql) 
    cur.fetchall() 
    for record in userPWDatabase: 
     if record == UserPW: 
      #Create cookie 
      C= Cookie.SimpleCookie() 
      #take the value of the index.py form variable username 
      username= form.getvalue('usernameLogin') 
      #set the cookie with the usernameLogin key 
      C['usernameLogin']= username 
      print C 
      return 1 
     else: 
      return 0    

Я не знаю, где проблема

ответ

0

я только что прочитал, что материал заголовка Set-Cookie, предполагают, чтобы быть перед строкой:

print "Content_type: text/html\n\n" 

так, я снова сосредоточил свой код, и теперь он работает нормально. она восходит к предыдущему сценарию в случае неправильного имени пользователя/пароля и переходит к следующему сценарию после проверки Вот окончательный код:

#! usr/local/bin/python 
import cgi; 
import cgitb; 
import Cookie; 
import os; 
import sqlite3; 

cgitb.enable() 
username= None 
form= cgi.FieldStorage() 

#open connection 
conn= sqlite3.connect("manager.db") 
cur= conn.cursor() 

pagehead= """ 
    <html> 
     <head> Redirecting </head> 
     <body> 

      """ 
pagefoot="""<form method= POST action="http://localhost:8000/cgi-bin/page1.py"> 
      <p> Validated! <input type="submit" value="Enter"/> </p> 
      </form> 
     </body> 
    </html> """ 
errorpagefoot= """ 
<form action="http://localhost:8000/cgi-bin/index.py"> 
<p> Error! <input type="submit" value="Go Back"/> </p> 
</form> 
</body> 
</html>""" 


userName= form.getvalue('usernameLogin') 
userPW= form.getvalue('passwordLogin') 
userPWDatabase = conn.execute("SELECT username,passwrd FROM login WHERE username=? and passwrd=?",[userName,userPW]) 
cur.fetchone() 
for result in userPWDatabase: 
    userDb= result[0] 
    pwDb= result[1] 
    if userDb == userName and pwDb == userPW: 
     #Create Cookie 
     C= Cookie.SimpleCookie() 
     #take the value of usernameLogin into the variable username 
     username= form.getvalue('usernameLogin') 
     #Set-Cookie header with the usernameLogin key 
     C['usernameLogin'] = username 
     print C 
    elif userDb != userName and pwDb != userPW: 
     print errorpagefoot 

print "Content_type: text/html\n\n" 
print pagehead 
if username: 
    print pagefoot 
else: 
    print errorpagefoot 

@Alexis

Спасибо за ваше время и помочь Алексис :)

1

Не могли бы вы предоставить более подробную информацию, чем «Я не знаю, где проблема»: что именно происходит, какие сообщения журнала вы получаете, если они есть.

Вы пытались переместить определение функции проверки до того, как оно вызвано? Я думаю, что это может быть частью вашей проблемы.


Update: после некоторых исследований и несколько исправлений, я получил это работает:

  1. Как ранее говорилось, определение функции «проверить» должно быть установлено до того, как называется
  2. Ваш SQL запрос неверно, поскольку «SELECT * FROM login» вернет 3 поля (id, username и passwrd), поэтому вы должны изменить его на «SELECT username, passwrd FROM login»
  3. Запись, возвращаемая sqlite, является кортежем, и вы «пытаюсь скомбинировать его с списком, так что существует ошибка типа TYPE тч. Одно из решений, если изменить на: «если список (запись) == UserPW:«

Кроме того, под ubuntu, смотрящим /var/log/apache2/error.log, много помогает.

Что в конечном итоге привело к:

#!/usr/bin/env python 

import cgi; 
import cgitb; 
import Cookie; 
import os; 
import sqlite3; 

#open connection 
conn= sqlite3.connect("manager.db") 
cur= conn.cursor() 

username= None 
form= cgi.FieldStorage() 


def validate(UserPW): 
     sql= "SELECT username,passwrd FROM login;" 
     cur.execute(sql) 
     userPWDatabase=cur.fetchall() 
     for record in userPWDatabase: 
      if list(record) == UserPW: 
       #Create cookie 
       C= Cookie.SimpleCookie() 
       #take the value of the index.py form variable username 
       username= form.getvalue('usernameLogin') 
       #set the cookie with the usernameLogin key 
       C['usernameLogin']= username 
       print C 
       return 1 
      else: 
       return 0    



UserPW= [form.getvalue('usernameLogin'), form.getvalue('passwordLogin')] 
isValidate = validate(UserPW); 

if isValidate == 1: 
     print "Content-type: text/html\n\n" 
     print """ 
     <html> 
      <head> Redirecting </head> 
      <body> 
       <form method= POST action="http://localhost:8000/cgi-bin/page1.py"> 
       <p> Validated! <input type="submit" value="Enter"/> </p> 
       </form> 
      </body> 
     </html> """ 
elif isValidate == 0: 
     print "Content-type: text/html\n\n" 
     print """ 
     <html> 
      <head> Redirecting </head> 
      <body> 
       <form method=POST action= "http://localhost:8000/cgi-bin/index.py"> 
        <p> Username or Password incorrect! <input type="submit" value="Go back"/> </p> 
       </form> 
      </body> 
     </html> 
     """ 
+0

Да, я только что перевел проверку правильности функции. Проблема в том, что я просто получаю пустую страницу. он не перемещается на следующую страницу, поэтому это означает, что он не проверяет его. Потому что в коде я кодировал «isValidate = 0 и isValidate = 1», и эти два значения, возвращаемые функцией, проверяются. Поскольку он не выполняет какие-либо части кода в рамках условий, это означает, что он вообще не выполняет функцию проверки. Но я не понимаю, почему это так. – user1353190

+0

Было бы очень полезно, если бы у вас был выход из журнала , Вы нашли что-нибудь подобное? – Alexis

+0

Я внесла некоторые изменения в код. кажется, что это не правильно выполняют базы данных: – user1353190

0

Я изменил код validate.py на это:

#! usr/local/bin/python 
import cgi; 
import cgitb; 
import Cookie; 
import os; 
import sqlite3; 

cgitb.enable() 
username= None 
form= cgi.FieldStorage() 

#open connection 
conn= sqlite3.connect("manager.db") 
cur= conn.cursor() 

pagehead= """ 
    <html> 
     <head> Redirecting </head> 
     <body> 

      """ 
pagefoot="""<form method= POST action="http://localhost:8000/cgi-bin/page1.py"> 
      <p> Validated! <input type="submit" value="Enter"/> </p> 
      </form> 
     </body> 
    </html> """ 
errorpagefoot= """ 
<form action="http://localhost:8000/cgi-bin/index.py"> 
<p> Error! <input type="submit" value="Go Back"/> </p> 
</form> 
</body> 
</html>""" 


print "Content_type: text/html\n\n" 
print pagehead 
userName= form.getvalue('usernameLogin') 
userPW= form.getvalue('passwordLogin') 
userPWDatabase = conn.execute("SELECT username,passwrd FROM login WHERE username=? and passwrd=?",[userName,userPW]) 
cur.fetchone() 
for result in userPWDatabase: 
    userDb= result[0] 
    pwDb= result[1] 
    if userDb == userName and pwDb == userPW: 
     #Create Cookie 
     C= Cookie.SimpleCookie() 
     #take the value of usernameLogin into the variable username 
     username= form.getvalue('usernameLogin') 
     #Set-Cookie header with the usernameLogin key 
     C['usernameLogin'] = username 
     print C 
     print pagefoot  
    elif userDb != userName and pwDb != userPW: 
     print errorpagefoot 

он сейчас работает, но это не перенаправлять на предыдущую страницу больше, упаковывают Неправильное имя пользователя или пароль

0

Хорошо, прочитав новый код, кажется, у вас все еще есть несколько ошибок, но основная ошибка, о которой я думаю, это то, как вы пытаетесь проверить логин/пароль: сначала вы выберите его из базы данных byt-фильтрации по имени пользователя и паролю, который может возвращать только 1 или 0 результат, поскольку логин является основным в вашем db, а затем вы пытаетесь зацикливать результаты и проверить правильность имени пользователя и пароля , или оба неверные, что, следовательно, не распространяется на случай, когда имя пользователя правильное, но не пароль (и инверсный). Поэтому я предлагаю вам изменить последнюю часть кода для этого:

print "Content-type: text/html\n\n" 
print pagehead 
userName= form.getvalue('usernameLogin') 
userPW= form.getvalue('passwordLogin') 
cur.execute("SELECT username,passwrd FROM login WHERE username=?",[userName]) 
userPWDatabase = cur.fetchone() 
if userPWDatabase is not None: 
     userDb= userPWDatabase[0] 
     pwDb= userPWDatabase[1] 
     #Create Cookie 
     C= Cookie.SimpleCookie() 
     #take the value of usernameLogin into the variable username 
     username= form.getvalue('usernameLogin') 
     #Set-Cookie header with the usernameLogin key 
     C['usernameLogin'] = username 
     print C 
     print pagefoot  
else: 
     print errorpagefoot 

Обратите внимание, что вы также можете сохранить ваш SQL запрос с фильтром по имени пользователя и пароля, но тогда вам не нужно, чтобы проверить что-нибудь еще: если результата нет, одно из двух полей неверно, и есть одно, это обязательно хорошо.

Кроме того, я не знаю, что ваша цель (или научиться CGI-BIN/Python или установки реального приложения), но вы можете быть заинтересованы, чтобы посмотреть на Django (www.djangoproject.com)

Смежные вопросы