from flask import Flask, render_template, request, escape
from vsearch import search_for_letters
app = Flask( __name__)
def log_request( req: 'flask_request' , res: str) -> None:
dbconfig = { 'host' : '127.0.0.1' ,
'user' : 'vsearch' ,
'password' : 'vsearchpasswd' ,
'database' : 'vsearchlogDB' }
import mysql.connector
conn = mysql.connector .connect ( ** dbconfig)
cursor = conn.cursor ( )
_SQL = "" "insert into log
(phrase,letters,ip,browser_string,results)
values
(%s,%s,%s,%s,%s)" ""
cursor.execute ( _SQL, ( req.form [ 'phrase' ] ,
req.form [ 'letters' ] ,
req.remote_addr ,
req.user_agent .browser ,
res, ) )
conn.commit ( )
cursor.close ( )
conn.close ( )
"" "@app.route('/viewlog',methods=['POST','GET'])
def view_the_log()->'html':
contents = []
with open('vsearch.log') as log: #открыть файл журнала для чтения
for line in log:
contents.append([])
for item in line.split('|'):
contents[-1].append(escape(item))
titles = ('Form Data', 'Remote_addr', 'User_agent', 'Results')
return render_template('viewlog.html',
the_title = 'View Title',
the_row_titles = titles,
the_data=contents,)" ""
@app.route ( '/search4' , methods= [ 'POST' , 'GET' ] )
def do_search( ) -> 'html' :
phrase = request.form [ 'phrase' ]
letters = request.form [ 'letters' ]
title = 'Here are your results:'
results = str( search_for_letters( phrase, letters) )
log_request( request, results)
return render_template( 'results.html' , the_title= title,
the_letters= letters, the_phrase= phrase, the_results= results)
@app.route ( '/' )
@app.route ( '/entry' )
def entry_page( ) -> 'html' :
return render_template( 'entry.html' , the_title= 'Welcome for our site!' )
app.run ( debug= True)
ZnJvbSBmbGFzayBpbXBvcnQgRmxhc2sscmVuZGVyX3RlbXBsYXRlLHJlcXVlc3QsZXNjYXBlCmZyb20gdnNlYXJjaCBpbXBvcnQgc2VhcmNoX2Zvcl9sZXR0ZXJzCgphcHAgPSBGbGFzayhfX25hbWVfXykKCmRlZiBsb2dfcmVxdWVzdChyZXE6ICdmbGFza19yZXF1ZXN0JyxyZXM6c3RyKS0+Tm9uZToKICAgIGRiY29uZmlnID0geydob3N0JzonMTI3LjAuMC4xJywKICAgICAgICAgICAgICAgICd1c2VyJzondnNlYXJjaCcsCiAgICAgICAgICAgICAgICAncGFzc3dvcmQnOid2c2VhcmNocGFzc3dkJywKICAgICAgICAgICAgICAgICdkYXRhYmFzZSc6J3ZzZWFyY2hsb2dEQid9CiAgICAKICAgIGltcG9ydCBteXNxbC5jb25uZWN0b3IKCiAgICBjb25uID0gbXlzcWwuY29ubmVjdG9yLmNvbm5lY3QoKipkYmNvbmZpZykKICAgIGN1cnNvciA9IGNvbm4uY3Vyc29yKCkKCiAgICBfU1FMID0gIiIiaW5zZXJ0IGludG8gbG9nCiAgICAgICAgICAgKHBocmFzZSxsZXR0ZXJzLGlwLGJyb3dzZXJfc3RyaW5nLHJlc3VsdHMpCiAgICAgICAgICAgIHZhbHVlcwogICAgICAgICAgICglcywlcywlcywlcywlcykiIiIKICAgIGN1cnNvci5leGVjdXRlKF9TUUwsKHJlcS5mb3JtWydwaHJhc2UnXSwKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5mb3JtWydsZXR0ZXJzJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICByZXEucmVtb3RlX2FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICByZXEudXNlcl9hZ2VudC5icm93c2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgcmVzLCkpCiAgICBjb25uLmNvbW1pdCgpCiAgICBjdXJzb3IuY2xvc2UoKQogICAgY29ubi5jbG9zZSgpCgoiIiJAYXBwLnJvdXRlKCcvdmlld2xvZycsbWV0aG9kcz1bJ1BPU1QnLCdHRVQnXSkKZGVmIHZpZXdfdGhlX2xvZygpLT4naHRtbCc6CiAgICBjb250ZW50cyA9IFtdCiAgICB3aXRoIG9wZW4oJ3ZzZWFyY2gubG9nJykgYXMgbG9nOiAj0L7RgtC60YDRi9GC0Ywg0YTQsNC50Lsg0LbRg9GA0L3QsNC70LAg0LTQu9GPINGH0YLQtdC90LjRjwogICAgICAgIGZvciBsaW5lIGluIGxvZzoKICAgICAgICAgICAgY29udGVudHMuYXBwZW5kKFtdKQogICAgICAgICAgICBmb3IgaXRlbSBpbiBsaW5lLnNwbGl0KCd8Jyk6CiAgICAgICAgICAgICAgICBjb250ZW50c1stMV0uYXBwZW5kKGVzY2FwZShpdGVtKSkKICAgIHRpdGxlcyA9ICgnRm9ybSBEYXRhJywgJ1JlbW90ZV9hZGRyJywgJ1VzZXJfYWdlbnQnLCAnUmVzdWx0cycpCiAgICByZXR1cm4gcmVuZGVyX3RlbXBsYXRlKCd2aWV3bG9nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlX3RpdGxlID0gJ1ZpZXcgVGl0bGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlX3Jvd190aXRsZXMgPSB0aXRsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVfZGF0YT1jb250ZW50cywpIiIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAKICAgIApAYXBwLnJvdXRlKCcvc2VhcmNoNCcsbWV0aG9kcz1bJ1BPU1QnLCdHRVQnXSkKZGVmIGRvX3NlYXJjaCgpLT4naHRtbCc6CiAgICBwaHJhc2UgPSByZXF1ZXN0LmZvcm1bJ3BocmFzZSddCiAgICBsZXR0ZXJzID0gcmVxdWVzdC5mb3JtWydsZXR0ZXJzJ10KICAgIHRpdGxlID0gJ0hlcmUgYXJlIHlvdXIgcmVzdWx0czonCiAgICByZXN1bHRzID0gc3RyKHNlYXJjaF9mb3JfbGV0dGVycyhwaHJhc2UsbGV0dGVycykpCiAgICBsb2dfcmVxdWVzdChyZXF1ZXN0LHJlc3VsdHMpCiAgICByZXR1cm4gcmVuZGVyX3RlbXBsYXRlKCdyZXN1bHRzLmh0bWwnLHRoZV90aXRsZT10aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlX2xldHRlcnM9bGV0dGVycyx0aGVfcGhyYXNlPXBocmFzZSx0aGVfcmVzdWx0cz1yZXN1bHRzKQpAYXBwLnJvdXRlKCcvJykKQGFwcC5yb3V0ZSgnL2VudHJ5JykKZGVmIGVudHJ5X3BhZ2UoKSAtPidodG1sJzoKICAgIHJldHVybiByZW5kZXJfdGVtcGxhdGUoJ2VudHJ5Lmh0bWwnLHRoZV90aXRsZT0nV2VsY29tZSBmb3Igb3VyIHNpdGUhJykKCmFwcC5ydW4oZGVidWc9VHJ1ZSkK