나는 사용자에게 register_no
, username
및 를 묻는 아주 간단한 로그인 페이지를 만들려고 합니다 password
. 그가 제출 버튼을 눌렀을 때. 기존 사용자인지 신규 사용자인지 확인하고 이에 따라 메시지를 표시하려고 합니다.
내 폴더 계층 구조는 다음과 같습니다
prodicus@Acer:~/Downloads/souvik_refactoring$ tree
.
├── cgi-bin
│ ├── creating_user_base_table.py
│ ├── user_base.db
│ └── usr_check.py
├── index.html
└── keyCheck.py
1 directory, 5 files
내가 시도한 것:
~을 위한index.html
<!DOCTYPE html>
<html>
<head>
<title>Login page</title>
</head>
<body>
<div style = "text-align : center ; ">
<h1>Login page</h1>
<form action="/cgi-bin/usr_check.py" method="get">
Registration number : <input type="number" name="register_no" min="1" max="2000000000">
<br><br>
Username : <input type="text" name="username">
<br><br>
Password : <input type="password" name = "password">
<br><br>
<input type="submit" value = "Login">
</form>
</div>
</body>
</html>
~을 위한creating_user_base_table.py
#!/usr/bin/env python3.4
import sqlite3
import os
db_name = "user_base.db"
if db_name in os.listdir():
print("removing the user_base.db and creating a fresh copy of it")
os.system("rm user_base.db")
print("Creating the database")
conn = sqlite3.connect(db_name)
cur = conn.cursor()
user_table = "CREATE TABLE users(reg_no INTEGER PRIMARY KEY, user_name TEXT, pass TEXT)"
new_users = (
(1081310251, 'admin', 'admin'),
(1081310234, 'foo', 'admin123')
)
cur.execute(user_table)
print("table created")
cur.executemany('INSERT INTO users VALUES(?, ?, ?)', new_users)
conn.commit()
print("default users created \n\ndisplaying them")
cur.execute('SELECT * FROM users')
print(cur.fetchall())
마침내usr_check.py
#/usr/bin/env python3.4
import cgi, cgitb
import os
import sqlite3
cgitb.enable()
form = cgi.FieldStorage()
register_no = form.getvalue('register_no')
username = form.getvalue('username')
passwd = form.getvalue('password')
print("Content-type:text/html\r\n\r\n")
print("<html>")
print("<head>")
print("<h1>Shit gets real here</h1>")
print("</head>")
print("<body>")
print('<div style = "text-align:center ; "')
# print("</div>")
print("")
conn = sqlite3.connect('user_base.db')
cur = conn.cursor()
## now to check whether the entered data is for
## -> new user
## -> an old user
cur.execute('SELECT user_name FROM users WHERE register_no = ?', (register_no,))
rows = cur.fetchall()
print("<br><br>")
if len(rows) == 0:
print("<p>User : <b>", username , "</b> does not exist.</p>")
cur.execute('INSERT INTO users VALUES(?, ?, ?)', (register_no, username, passwd))
print("<p>User was created successfully</p>")
print("Done")
else:
print("<p>Welcome<b>", username ,"</b>. Good to have you back")
print("<br><p>Your account details</p>")
print("<ul>")
print("<li>Register number : ", register_no, " </li>")
print("<li>Username " , username, "</li>")
print("</ul>")
오류 기록:
prodicus@Acer:~/Downloads/souvik_refactoring$ python -m CGIHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
127.0.0.1 - - [02/Nov/2015 12:43:23] "GET /index.html HTTP/1.1" 200 -
127.0.0.1 - - [02/Nov/2015 12:44:03] "GET /cgi-bin/usr_check.py?register_no=1081310234&username=foo&password=admin123 HTTP/1.1" 200 -
Traceback (most recent call last):
File "/usr/lib/python2.7/CGIHTTPServer.py", line 252, in run_cgi
os.execve(scriptfile, args, env)
OSError: [Errno 8] Exec format error
127.0.0.1 - - [02/Nov/2015 12:44:03] CGI script exit status 0x7f00
이것을 따르라https://stackoverflow.com/questions/10793042/sqlite3-insert-using-python-and-python-cgi파일 권한이 있습니다
prodicus@Acer:~/Downloads/souvik_refactoring$ ll
total 36
drwxrwxr-x 3 prodicus prodicus 4096 Nov 2 08:30 ./
drwxr-xr-x 15 prodicus prodicus 20480 Nov 2 11:29 ../
drwxrwxrwx 2 prodicus prodicus 4096 Nov 2 12:23 cgi-bin/
-rw-rw-r-- 1 prodicus prodicus 629 Nov 2 08:38 index.html
-rwxrwxr-x 1 prodicus prodicus 463 Nov 2 08:29 keyCheck.py*
그리고
prodicus@Acer:~/Downloads/souvik_refactoring/cgi-bin$ ll
total 20
drwxrwxrwx 2 prodicus prodicus 4096 Nov 2 12:23 ./
drwxrwxr-x 3 prodicus prodicus 4096 Nov 2 08:30 ../
-rwxrwxrwx 1 prodicus prodicus 710 Nov 1 23:12 creating_user_base_table.py*
-rwxrwxrwx 1 prodicus prodicus 2048 Nov 2 12:23 user_base.db*
-rwxrwxrwx 1 prodicus prodicus 1576 Nov 2 08:26 usr_check.py*
놀랍게도 cgitb
오류가 표시되지 않습니다. 내가 어디서 잘못됐나요?
답변1
마침내 무엇이 잘못되었는지 알아냈습니다. 아주 어리석은 실수를 저질렀어요! 나를 여기 초대해 준 @cas에게 감사드립니다.
#/usr/bin/env python3.4
대신 하나 만들었습니다 #!/usr/bin/env python3.4
.
둘째, usr_check.py
스크립트가 데이터베이스에 연결을 시도할 때 절대 경로를 제공해야 합니다 user_base.db
.
이것은 나를 위해 문제를 해결했습니다.