Estimated reading time: 6 minutes
More and more, website developers are looking to blend different programming technologies to allow them to use functionality, that maybe is not available to them in the current programming language they utilise.
In previous posts how to pass python variables to Javascript and how to run python directly from javascript, we touched on how to use Python and Javascript interchangeably to pass data.
Here in this blog post, we are going to look at data validation using Python, with data captured by Javascript. The purpose here is to allow another way to validate data other than relying on javascript.
There are a number of reasons for this:
- You may want to use Python to process the data and provide output.
- The data could be passed from Python into a database, you need to run some checks before you proceed.
- Python is your core language, you only use Javascript to capture the data and pass it from a website.
There are four validation checks
- Validation if a username exists.
- Validation if a number has been entered on a username field.
- Validation of a password entered.
- A validation check to make sure that an email address entered is in the correct format.
We have two files with the requisite code in them as follows:
- app.py ===> As this application is built in Python Flask, this file holds the logic to open the website files, and it holds the Python validation checks.
- index.html ====> This file holds the HTML that creates the pages, labels, and input boxes that appear in the web browser. It also includes the Javascript that will capture the data to be passed to Python for validation.
Code Overview – App.PY
Below, I will look to explain what is going on as follows:
The variable Regex is used in the email validation to check if the email entered is correct.
def inputcheck ===> This is just checking the username passed over and performing some validations on it.
def inputvalidation ====> This also is checking the username but looking at if numbers only are entered, or if it is empty.
def passvalidation ====> In this piece of logic, it checks if the password is empty, less than five characters, is numbers only.
def emailvalidation ====> All this is doing is checking if the data received from the Javascript is in the correct email format. It references the regex variable above, which is used to confirm if the format is correct or otherwise.
Within each of the functions, there are if statements which are the core validation checks used by Python.
Also, all the popup menus use ctypes, which allows you to access the windows libraries that hold message boxes, customise them and call within your program.
import json
import ctypes
import re
from flask import request,redirect,url_for
from flask import Flask, render_template
app = Flask(__name__)
regex = '^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$'
@app.route('/')
def index():
return render_template('index.html')
@app.route('/inputcheck', methods=['GET','POST'])
def inputcheck():
output = request.get_json()
result = json.loads(output) #this converts the json output to a python dictionary
username_list = ['joe','john']
if result['username'] in username_list:
MessageBox = ctypes.windll.user32.MessageBoxW(0, 'Username ' + result['username'] + ' ' + 'exists', "Username check", 0x00001000)
return render_template('various.html')
elif result['username'] == '':
MessageBox = ctypes.windll.user32.MessageBoxW(None, 'You cannot enter an empty value', 'Username check', 0x00001000)
else:
MessageBox = ctypes.windll.user32.MessageBoxW(None, 'Username ' + result['username'] + ' ' + 'does not exist', 'Username check', 0x00001000)
@app.route('/inputvalidation', methods=['GET','POST'])
def inputvalidation():
output = request.get_json()
result = json.loads(output) #this converts the json output to a python dictionary
if result['username'].isdecimal():
MessageBox = ctypes.windll.user32.MessageBoxW(None, 'Your username cannot be numbers',"Number check", 0x00001000)
elif result['username'] == '':
MessageBox = ctypes.windll.user32.MessageBoxW(None, 'The username cannot be empty', "Number check",0x00001000)
else:
MessageBox = ctypes.windll.user32.MessageBoxW(None, 'Your username looks ok', "Number check", 0x00001000)
return render_template('index.html')
@app.route('/passvalidation', methods=['GET','POST'])
def passvalidation():
output = request.get_json()
result = json.loads(output) #this converts the json output to a python dictionary
if result['password'].isdecimal():
MessageBox = ctypes.windll.user32.MessageBoxW(None, 'Your password cannot be numbers',"Password check", 0x00001000)
elif result['password'] == '':
MessageBox = ctypes.windll.user32.MessageBoxW(None, 'The password cannot be empty', "Password empty check",0x00001000)
elif len(result['password']) < 5:
MessageBox = ctypes.windll.user32.MessageBoxW(None, 'Your username should be greater than five characters', "Password length check", 0x00001000)
else:
MessageBox = ctypes.windll.user32.MessageBoxW(None, 'Your password looks ok', "Number check", 0x00001000)
return render_template('index.html')
@app.route('/emailvalidation', methods=['GET','POST'])
def emailvalidation():
output = request.get_json()
result = json.loads(output) #this converts the json output to a python dictionary
if re.search(regex, result['email']):
MessageBox = ctypes.windll.user32.MessageBoxW(None, 'Your email is in the correct format', "Email check", 0x00001000)
else:
MessageBox = ctypes.windll.user32.MessageBoxW(None, 'Your email is invalid, please correct', "Email check", 0x00001000)
return render_template('index.html')
if __name__ == "__main__":
app.run(debug=True)
Code Overview – Index.html
The below code is the page code, that allows the capturing of data through a web browser HTML page.
Between the <style></style> tags these are the CSS properties that format the labels and buttons on the page.
Within the <div></div> tags are where we create the labels and buttons to show on the screen. Also within these, are the references to the on click event function that should run once the buttons are clicked.
Within the <script></script> tags, this is where the javascript is written which captures the data entered into the input boxes within the <div> tags.
Also, you will see within this javascript, there are sections called $.ajax, which is where the data captured by the javascript is stored, and then passed onto the Python script file (app.py)
Note that in each ajax , url:”/APAGENAME” is referenced. These are the sections within the app.py that the data is passed to, and then the Python logic kicks in and validates the data.
<html lang="en">
<head>
<title>Data Analytics Ireland</title></head>
<style>
.button1 {
position: absolute;
top: 50%;
left: 55%;
width: 900px;
height: 300px;
margin-left: -300px;
margin-top: -80px;
}
.labels {
position: absolute;
top: 50%;
left: 55%;
width: 900px;
height: 300px;
margin-left: -300px;
margin-top: -150px;
}
</style>
<body>
<div class="labels" id="mem1" >
<label for="username">username:</label> <input type="text" id="username" name="username">
<label for="password">password:</label><input type="text" id="password" name="password">
<label for="email">email:</label><input type="text" id="email" name="password">
</div>
<div class="button1" id="mem2" >
<button type="submit" onclick='myfunction();'>Click here to validate your username</button>
<button type="submit" onclick='myfunctionval();'>Click here to check if a number</button>
<button type="submit" onclick='myfunctionpass();'>Click here to check password</button>
<button type="submit" onclick='myfunctionemail();'>Click here to check your email</button>
</div>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
<script>
function myfunction() {
const username = document.getElementById("username").value;
const password = document.getElementById("password").value;
const dict_values = {username, password} //Pass the javascript variables to a dictionary.
const s = JSON.stringify(dict_values); // Stringify converts a JavaScript object or value to JSON.
console.log(s); // Prints the variables to console window, which are in the JSON format
//window.alert(s)
$.ajax({
url:"/inputcheck",
type:"POST",
contentType: "application/json",
data: JSON.stringify(s)});
}
</script>
<script>
function myfunctionval() {
const username = document.getElementById("username").value;
const password = document.getElementById("password").value;
const dict_values = {username, password} //Pass the javascript variables to a dictionary.
const s = JSON.stringify(dict_values); // Stringify converts a JavaScript object or value to JSON.
console.log(s); // Prints the variables to console window, which are in the JSON format
//window.alert(s)
$.ajax({
url:"/inputvalidation",
type:"POST",
contentType: "application/json",
data: JSON.stringify(s)});
}
</script>
<script>
function myfunctionpass() {
const username = document.getElementById("username").value;
const password = document.getElementById("password").value;
const dict_values = {username, password} //Pass the javascript variables to a dictionary.
const s = JSON.stringify(dict_values); // Stringify converts a JavaScript object or value to JSON.
console.log(s); // Prints the variables to console window, which are in the JSON format
//window.alert(s)
$.ajax({
url:"/passvalidation",
type:"POST",
contentType: "application/json",
data: JSON.stringify(s)});
}
</script>
<script>
function myfunctionemail() {
const email = document.getElementById("email").value;
const dict_values = {email} //Pass the javascript variables to a dictionary.
const s = JSON.stringify(dict_values); // Stringify converts a JavaScript object or value to JSON.
console.log(s); // Prints the variables to console window, which are in the JSON format
//window.alert(s)
$.ajax({
url:"/emailvalidation",
type:"POST",
contentType: "application/json",
data: JSON.stringify(s)});
}
</script>
</body>
</html>