Hi Community,


In this article, I will introduce Python Flask Web Framework. Together we will create a minimal web application to connect to IRIS and get data from it.

Below you can find the steps we will need to follow:

* **Step 1 : Introduction to Python Flask Web Framework** * **Step 2 : Installation of Flask module** * **Step 3 : Creation of web application using Flask** * ****Step 4 : Use of HTML Templates **** * ****Step 5 : Installation of IRIS Python Native module**** * ****Step 6 :** Establishment of a connection with IRIS ** * ****Step 7 :** Transferring data from IRIS to Flask and displaying it** **So Let's start with step 1** ## **Step1-Introduction to Python Flask Web Framework ** **Flask is a small and lightweight Python web framework that provides useful tools and features that make creating web applications in Python easier. It gives developers flexibility and is a more accessible framework for new developers since it allows to build a web application quickly using only a single Python file. Flask is also extensible and doesn’t requires a particular directory structure or complicated boilerplate code before getting started.** **For more details please view Flask Documentations ![](/sites/default/files/inline/images/images/image(4480).png)** ****

Step 2 : Installation of Flask module

**Before we start building our Flask Web Application, we need to install the Flask module using the pip package installer.** **To install Flask, run the following command:** **pip install flask** **![](/sites/default/files/inline/images/images/image(4481).png)** **Flask latest version is install successfully.** **** ## ****Step3 : Creation of web application using Flask**** ****Now that we have installed the flask module, we will make a minimal web application inside a Python file and run it. This will start the server, which will display some information on the browser.**** ****Create a folder and create a python file inside. Let's name our folder flask2022 and the python file - app.py**** ****Below you can see an app.py file which will serve as a minimal example of how to handle HTTP requests****
<span class="hljs-selector-tag">from</span> <span class="hljs-selector-tag">flask</span> <span class="hljs-selector-tag">import</span> <span class="hljs-selector-tag">Flask</span>

<span class="hljs-selector-tag">app</span> = <span class="hljs-selector-tag">Flask</span>(__<span class="hljs-selector-tag">name__</span>)

@<span class="hljs-keyword">app</span>.<span class="hljs-keyword">route</span>("/")
def hello_world():
    return <span class="hljs-string">"<p>Hello, This is Flask Application!</p>"</span>
if __name__ == <span class="hljs-string">'__main__'</span>:
    app.run(debug=True)    
******Code Explained:******
<span class="hljs-selector-id">#First</span> <span class="hljs-selector-tag">we</span> <span class="hljs-selector-tag">import</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">Flask</span> <span class="hljs-selector-tag">class</span>. <span class="hljs-selector-tag">An</span> <span class="hljs-selector-tag">instance</span> <span class="hljs-selector-tag">of</span> <span class="hljs-selector-tag">this</span> <span class="hljs-selector-tag">class</span> <span class="hljs-selector-tag">will</span> <span class="hljs-selector-tag">be</span> <span class="hljs-selector-tag">our</span> <span class="hljs-selector-tag">WSGI</span> <span class="hljs-selector-tag">application</span>
<span class="hljs-selector-tag">from</span> <span class="hljs-selector-tag">flask</span> <span class="hljs-selector-tag">import</span> <span class="hljs-selector-tag">Flask</span>

<span class="hljs-selector-id">#Next</span> <span class="hljs-selector-tag">we</span> <span class="hljs-selector-tag">create</span> <span class="hljs-selector-tag">an</span> <span class="hljs-selector-tag">instance</span> <span class="hljs-selector-tag">of</span> <span class="hljs-selector-tag">this</span> <span class="hljs-selector-tag">class</span>. <span class="hljs-selector-tag">The</span> <span class="hljs-selector-tag">first</span> <span class="hljs-selector-tag">argument</span> <span class="hljs-selector-tag">is</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">name</span> <span class="hljs-selector-tag">of</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">application</span> <span class="hljs-selector-tag">module</span> <span class="hljs-selector-tag">or</span> <span class="hljs-selector-tag">package</span>. __<span class="hljs-selector-tag">name__</span> <span class="hljs-selector-tag">is</span> <span class="hljs-selector-tag">a</span> <span class="hljs-selector-tag">convenient</span> <span class="hljs-selector-tag">shortcut</span> <span class="hljs-selector-tag">for</span> <span class="hljs-selector-tag">this</span> <span class="hljs-selector-tag">which</span> <span class="hljs-selector-tag">is</span> <span class="hljs-selector-tag">appropriate</span> <span class="hljs-selector-tag">for</span> <span class="hljs-selector-tag">most</span> <span class="hljs-selector-tag">cases</span>. <span class="hljs-selector-tag">This</span> <span class="hljs-selector-tag">is</span> <span class="hljs-selector-tag">needed</span> <span class="hljs-selector-tag">so</span> <span class="hljs-selector-tag">Flask</span> <span class="hljs-selector-tag">to</span> <span class="hljs-selector-tag">know</span> <span class="hljs-selector-tag">where</span> <span class="hljs-selector-tag">to</span> <span class="hljs-selector-tag">look</span> <span class="hljs-selector-tag">for</span> <span class="hljs-selector-tag">resources</span> <span class="hljs-selector-tag">such</span> <span class="hljs-selector-tag">as</span> <span class="hljs-selector-tag">templates</span> <span class="hljs-selector-tag">and</span> <span class="hljs-selector-tag">static</span> <span class="hljs-selector-tag">files</span>.
<span class="hljs-selector-tag">app</span> = <span class="hljs-selector-tag">Flask</span>(__<span class="hljs-selector-tag">name__</span>)

<span class="hljs-selector-id">#Once</span> <span class="hljs-selector-tag">you</span> <span class="hljs-selector-tag">have</span> <span class="hljs-selector-tag">created</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">app</span> <span class="hljs-selector-tag">instance</span>, <span class="hljs-selector-tag">you</span> <span class="hljs-selector-tag">will</span> <span class="hljs-selector-tag">be</span> <span class="hljs-selector-tag">able</span> <span class="hljs-selector-tag">to</span> <span class="hljs-selector-tag">use</span> <span class="hljs-selector-tag">it</span> <span class="hljs-selector-tag">to</span> <span class="hljs-selector-tag">handle</span> <span class="hljs-selector-tag">incoming</span> <span class="hljs-selector-tag">web</span> <span class="hljs-selector-tag">requests</span> <span class="hljs-selector-tag">and</span> <span class="hljs-selector-tag">send</span> <span class="hljs-selector-tag">responses</span> <span class="hljs-selector-tag">to</span> <span class="hljs-selector-tag">the</span> <span class="hljs-selector-tag">user</span>. @<span class="hljs-keyword">app</span>.<span class="hljs-keyword">route</span> is a decorator that turns a regular Python function into a Flask view function, which converts the function return value into an HTTP response to be displayed by an HTTP client, such as a web browser. You pass the value <span class="hljs-string">'/'</span> to @app.route() to signify that this function will respond to web requests for the URL /, which is the main URL
@app.route(<span class="hljs-string">"/"</span>)
#The function returns the message we want to display in the user’s browser. The default content type is HTML. That is why  HTML in the string will be rendered by the browser. We can define any unique function name as
def hello_world():
    return <span class="hljs-string">"<p>Hello, World!</p>"</span>
#Now start server and Run the application with debug = True to display errors in browser if any    
if __name__ == <span class="hljs-string">'__main__'</span>:
    app.run(debug=True)    
****From the app.py file location, run the command mentioned below to start the application at the command prompt:****
python app.py
****![](/sites/default/files/inline/images/images/image(4482).png)**** ****The preceding output has several pieces of information, such as:**** * ****The name of the application you’re running.**** * ****The environment in which the application is being run.**** * ****`Debug mode: on`, which signifies that the Flask debugger is running. This is useful when developing because it gives us detailed error messages when things go wrong, which makes troubleshooting easier.**** * ****The application is running locally on the URL http://127.0.0.1:5000/, 127.0.0.1 is the IP that represents your machine’s localhost and :5000 is the port number.**** ****Open a browser and type in the URL `http://127.0.0.1:5000/`, you will receive the string `Hello, World!` as a response. This confirms that your application is running successfully.**** ****![](/sites/default/files/inline/images/images/image(4483).png)**** ******Congratulation our first flask application is running ****** ******** ## ******Step 4 : Use of HTML Templates ****** ****Currently our application only displays a simple message without any HTML. Web applications mainly use HTML to display information for the visitor, so we will now work on incorporating HTML files in our app to display it on the web browser.**** ****Flask provides a `render_template()` helper function that allows us to use the [Jinja template engine](http://jinja.pocoo.org/). It makes managing HTML much easier by writing your HTML code in `.html` files and using logic in your HTML code. **** ****Let's create "templates" folder in our flask2022 folder.  Please note that folder name must be "templates", and it should have the same location  where our "app.py" file is located. Below you can see the directory structure once we have created our templates folder:**** ****![](/sites/default/files/inline/images/images/image(4487).png)**** ****Let us create an index.htm file in the templates folder. Check the example below.****

<html>
<body>
<h1>My First Heading</h1>
<p>My first paragraph.</p>
</body>
</html>
****After that, let us modify the app.py file to render the template instead of displaying simple text.****
<span class="hljs-selector-tag">from</span> <span class="hljs-selector-tag">flask</span> <span class="hljs-selector-tag">import</span> <span class="hljs-selector-tag">Flask</span>,<span class="hljs-selector-tag">render_template</span>

<span class="hljs-selector-tag">app</span> = <span class="hljs-selector-tag">Flask</span>(__<span class="hljs-selector-tag">name__</span>)

@<span class="hljs-keyword">app</span>.<span class="hljs-keyword">route</span>("/")
def hello_world():
    return render_template(<span class="hljs-string">'index.html'</span>)

if __name__ == <span class="hljs-string">'__main__'</span>:
    app.run(debug=True)    
****Please note two modification in above-mentioned code. The The first one is that we are importing render_template from the flask module. The second one is that we are returning the index.html page in the hello_world function which we saved in the templates folder by using render_template() function.**** ****Let us run the application and navigate to http://127.0.0.1:5000**** ****![](/sites/default/files/inline/images/images/image(4485).png)**** ****This time we are getting HTML which we saved in templates folder.**** ******** ## ******Step 5 : Installation of IRIS Python Native module****** Now in order to communicate with IRIS, we need to install IRIS python wheel file. For more details please read Native SDK for Python Quick Reference Depending on the operating system and installation path, the WHL is located at <InterSystems installation directory>\dev\python folder ****Since I am using windows, and my installation directory is c:\InterSystems, so the whl file path will be:**** C:\InterSystems\IRISHealth\dev\python\intersystems_irispython-3.2.0-py3-none-any.whl Let's install the IRIS python native module by using below command quoted below:
pip install C:\InterSystems\IRISHealth\dev\python\intersystems_irispython-3.2.0-py3-none-any.whl
****![](/sites/default/files/inline/images/images/image(4486).png)**** ****Now the IRIS python native module has been installed successfully**** ******** ## ******Step 6 : Establishment of a connection  ****** First, we need to import irisnative module in python by using below command
import irisnative
******then we will use irisnative module createConnection() function by passing following parameters******
# Create connection to InterSystems IRIS
connection = irisnative.createConnection(ip, port, namespace, username, password)
******After that, we will create an IRIS object by using irisnative module createIris() function by using below command******
# Create an iris object
iris_native = irisnative.createIris(connection) 
******For more details please read Python Native API documentation Below you can find the code of the python file:******
&lt;span class="hljs-selector-tag">from&lt;/span> &lt;span class="hljs-selector-tag">flask&lt;/span> &lt;span class="hljs-selector-tag">import&lt;/span> &lt;span class="hljs-selector-tag">Flask&lt;/span>,&lt;span class="hljs-selector-tag">render_template&lt;/span>
&lt;span class="hljs-selector-tag">import&lt;/span> &lt;span class="hljs-selector-tag">irisnative&lt;/span>

&lt;span class="hljs-selector-tag">app&lt;/span> = &lt;span class="hljs-selector-tag">Flask&lt;/span>(__&lt;span class="hljs-selector-tag">name__&lt;/span>)

### &lt;span class="hljs-selector-tag">Native&lt;/span> &lt;span class="hljs-selector-tag">API&lt;/span> &lt;span class="hljs-selector-tag">connection&lt;/span>'&lt;span class="hljs-selector-tag">s&lt;/span> &lt;span class="hljs-selector-tag">parameters&lt;/span>
&lt;span class="hljs-selector-tag">ip&lt;/span> = "&lt;span class="hljs-selector-tag">localhost&lt;/span>"
&lt;span class="hljs-selector-tag">port&lt;/span> = 1972
&lt;span class="hljs-selector-tag">namespace&lt;/span> = "&lt;span class="hljs-selector-tag">USER&lt;/span>"
&lt;span class="hljs-selector-tag">username&lt;/span> = "_&lt;span class="hljs-selector-tag">SYSTEM&lt;/span>"
&lt;span class="hljs-selector-tag">password&lt;/span> = "&lt;span class="hljs-selector-tag">SYS&lt;/span>"
##&lt;span class="hljs-selector-id">#Create&lt;/span> &lt;span class="hljs-selector-tag">database&lt;/span> &lt;span class="hljs-selector-tag">connection&lt;/span> &lt;span class="hljs-selector-tag">and&lt;/span> &lt;span class="hljs-selector-tag">IRIS&lt;/span> &lt;span class="hljs-selector-tag">instance&lt;/span>
&lt;span class="hljs-selector-tag">try&lt;/span>:
    &lt;span class="hljs-selector-id">#Return&lt;/span> &lt;span class="hljs-selector-tag">a&lt;/span> &lt;span class="hljs-selector-tag">new&lt;/span> &lt;span class="hljs-selector-tag">open&lt;/span> &lt;span class="hljs-selector-tag">connection&lt;/span> &lt;span class="hljs-selector-tag">to&lt;/span> &lt;span class="hljs-selector-tag">an&lt;/span> &lt;span class="hljs-selector-tag">IRIS&lt;/span> &lt;span class="hljs-selector-tag">instance&lt;/span>.
    &lt;span class="hljs-selector-tag">connection&lt;/span> = &lt;span class="hljs-selector-tag">irisnative&lt;/span>&lt;span class="hljs-selector-class">.createConnection&lt;/span>(&lt;span class="hljs-selector-tag">ip&lt;/span>, &lt;span class="hljs-selector-tag">port&lt;/span>, &lt;span class="hljs-selector-tag">namespace&lt;/span>, &lt;span class="hljs-selector-tag">username&lt;/span>, &lt;span class="hljs-selector-tag">password&lt;/span>)
    &lt;span class="hljs-selector-id">#Return&lt;/span> &lt;span class="hljs-selector-tag">a&lt;/span> &lt;span class="hljs-selector-tag">new&lt;/span> &lt;span class="hljs-selector-tag">irisnative&lt;/span>&lt;span class="hljs-selector-class">.iris&lt;/span> &lt;span class="hljs-selector-tag">object&lt;/span> &lt;span class="hljs-selector-tag">that&lt;/span> &lt;span class="hljs-selector-tag">uses&lt;/span> &lt;span class="hljs-selector-tag">the&lt;/span> &lt;span class="hljs-selector-tag">given&lt;/span> &lt;span class="hljs-selector-tag">connection&lt;/span>.
    &lt;span class="hljs-selector-tag">myIris&lt;/span> = &lt;span class="hljs-selector-tag">irisnative&lt;/span>&lt;span class="hljs-selector-class">.createIris&lt;/span>(&lt;span class="hljs-selector-tag">connection&lt;/span>)
&lt;span class="hljs-selector-tag">except&lt;/span> &lt;span class="hljs-selector-tag">Exception&lt;/span> &lt;span class="hljs-selector-tag">as&lt;/span> &lt;span class="hljs-selector-tag">e&lt;/span>:
    &lt;span class="hljs-selector-tag">print&lt;/span>(&lt;span class="hljs-selector-tag">e&lt;/span>)


@&lt;span class="hljs-keyword">app&lt;/span>.&lt;span class="hljs-keyword">route&lt;/span>("/")
def hello_world():
    return render_template(&lt;span class="hljs-string">'index.html'&lt;/span>)
    
if __name__ == &lt;span class="hljs-string">'__main__'&lt;/span>:
    app.run(debug=True)    
************ ## ********Step 7 : Transferring data from IRIS to Flask and displaying it********  In this final step we will: (1) get data from Global   (2) pass the data to index.html (3) display the data in HTML (1)Getting the data from global:
myGlobal = myIris.get("myGlobal")
(2)The following code will pass myGlobal data to the index.html and render the template:
return render_template('index.html',MyGlobal = myGlobal)
(3) Below HTML code will display MyGlobal data:


Global Value : {{ MyGlobal }}

******** ******** ********Beneath you can see the output of the HTML file: ![](/sites/default/files/inline/images/images/image(4490).png)******** **************** ## ********Summary******** ********In this article after defining the Flask web framework, I demonstrated how to install the Flask web framework, create a web application, use HTML templates, install the IRIS python native module, establish a connection with IRIS, transition data from IRIS to Flask and display it. ******** ********Check out the final python and HTML files below:********
&lt;span class="hljs-selector-tag">from&lt;/span> &lt;span class="hljs-selector-tag">flask&lt;/span> &lt;span class="hljs-selector-tag">import&lt;/span> &lt;span class="hljs-selector-tag">Flask&lt;/span>,&lt;span class="hljs-selector-tag">render_template&lt;/span>
&lt;span class="hljs-selector-tag">import&lt;/span> &lt;span class="hljs-selector-tag">irisnative&lt;/span>

&lt;span class="hljs-selector-tag">app&lt;/span> = &lt;span class="hljs-selector-tag">Flask&lt;/span>(__&lt;span class="hljs-selector-tag">name__&lt;/span>)

### &lt;span class="hljs-selector-tag">Native&lt;/span> &lt;span class="hljs-selector-tag">API&lt;/span> &lt;span class="hljs-selector-tag">connection&lt;/span>'&lt;span class="hljs-selector-tag">s&lt;/span> &lt;span class="hljs-selector-tag">parameters&lt;/span>
&lt;span class="hljs-selector-tag">ip&lt;/span> = "&lt;span class="hljs-selector-tag">localhost&lt;/span>"
&lt;span class="hljs-selector-tag">port&lt;/span> = 1972
&lt;span class="hljs-selector-tag">namespace&lt;/span> = "&lt;span class="hljs-selector-tag">USER&lt;/span>"
&lt;span class="hljs-selector-tag">username&lt;/span> = "_&lt;span class="hljs-selector-tag">SYSTEM&lt;/span>"
&lt;span class="hljs-selector-tag">password&lt;/span> = "&lt;span class="hljs-selector-tag">SYS&lt;/span>"
##&lt;span class="hljs-selector-id">#Create&lt;/span> &lt;span class="hljs-selector-tag">database&lt;/span> &lt;span class="hljs-selector-tag">connection&lt;/span> &lt;span class="hljs-selector-tag">and&lt;/span> &lt;span class="hljs-selector-tag">IRIS&lt;/span> &lt;span class="hljs-selector-tag">instance&lt;/span>
&lt;span class="hljs-selector-tag">try&lt;/span>:
    &lt;span class="hljs-selector-id">#Return&lt;/span> &lt;span class="hljs-selector-tag">a&lt;/span> &lt;span class="hljs-selector-tag">new&lt;/span> &lt;span class="hljs-selector-tag">open&lt;/span> &lt;span class="hljs-selector-tag">connection&lt;/span> &lt;span class="hljs-selector-tag">to&lt;/span> &lt;span class="hljs-selector-tag">an&lt;/span> &lt;span class="hljs-selector-tag">IRIS&lt;/span> &lt;span class="hljs-selector-tag">instance&lt;/span>.
    &lt;span class="hljs-selector-tag">connection&lt;/span> = &lt;span class="hljs-selector-tag">irisnative&lt;/span>&lt;span class="hljs-selector-class">.createConnection&lt;/span>(&lt;span class="hljs-selector-tag">ip&lt;/span>, &lt;span class="hljs-selector-tag">port&lt;/span>, &lt;span class="hljs-selector-tag">namespace&lt;/span>, &lt;span class="hljs-selector-tag">username&lt;/span>, &lt;span class="hljs-selector-tag">password&lt;/span>)
    &lt;span class="hljs-selector-id">#Return&lt;/span> &lt;span class="hljs-selector-tag">a&lt;/span> &lt;span class="hljs-selector-tag">new&lt;/span> &lt;span class="hljs-selector-tag">irisnative&lt;/span>&lt;span class="hljs-selector-class">.iris&lt;/span> &lt;span class="hljs-selector-tag">object&lt;/span> &lt;span class="hljs-selector-tag">that&lt;/span> &lt;span class="hljs-selector-tag">uses&lt;/span> &lt;span class="hljs-selector-tag">the&lt;/span> &lt;span class="hljs-selector-tag">given&lt;/span> &lt;span class="hljs-selector-tag">connection&lt;/span>.
    &lt;span class="hljs-selector-tag">myIris&lt;/span> = &lt;span class="hljs-selector-tag">irisnative&lt;/span>&lt;span class="hljs-selector-class">.createIris&lt;/span>(&lt;span class="hljs-selector-tag">connection&lt;/span>)
&lt;span class="hljs-selector-tag">except&lt;/span> &lt;span class="hljs-selector-tag">Exception&lt;/span> &lt;span class="hljs-selector-tag">as&lt;/span> &lt;span class="hljs-selector-tag">e&lt;/span>:
    &lt;span class="hljs-selector-tag">print&lt;/span>(&lt;span class="hljs-selector-tag">e&lt;/span>)

&lt;span class="hljs-selector-id">#getting&lt;/span> &lt;span class="hljs-selector-tag">the&lt;/span> &lt;span class="hljs-selector-tag">data&lt;/span> &lt;span class="hljs-selector-tag">from&lt;/span> &lt;span class="hljs-selector-tag">global&lt;/span>
&lt;span class="hljs-selector-tag">myGlobal&lt;/span> = &lt;span class="hljs-selector-tag">myIris&lt;/span>&lt;span class="hljs-selector-class">.get&lt;/span>("&lt;span class="hljs-selector-tag">myGlobal&lt;/span>")

@&lt;span class="hljs-keyword">app&lt;/span>.&lt;span class="hljs-keyword">route&lt;/span>("/")
def hello_world():
    #Pass myGlobal data and render HTML
    return render_template(&lt;span class="hljs-string">'index.html'&lt;/span>,MyGlobal = myGlobal)
    
if __name__ == &lt;span class="hljs-string">'__main__'&lt;/span>:
    app.run(debug=True)    

&lt;html>
&lt;body>
&lt;h1>My First Heading&lt;/h1>
&lt;p>My first paragraph.&lt;/p>
&lt;p>Global Value : &lt;b>{{ MyGlobal }}&lt;/b>&lt;/p>
&lt;/body>
&lt;/html>
********In the next article, I will cover Routing in Flask Framework, the use of Static folder, Bootstrap, getting and displaying table data.******** ********Thanks********