{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Web Programming\n", "## 10/26/2023\n", "\n", "print view\n", "\n", "notebook\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%html\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Remember This?\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "http://bits.csb.pitt.edu/pgammodel/pgam.cgi" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Bringing your code to the web\n", "\n", "Putting your applications online can make them much more useful." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%html\n", "
\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Server side computing\n", "\n", "We want a user to be able to run a python script through a web site.\n", "\n", "They should be able to specify the input arguments.\n", "\n", "They need to see the result (note this implies the python program should finish quickly).\n", "\n", "The python script is run _on the server_." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Common Gateway Interface\n", "\n", "CGI provides a standard interface to let webservers execute programs.\n", "\n", "http://bits.csb.pitt.edu/pgammodel/pgam.cgi\n", "\n", "**pgam.cgi** is a python script, but because it has the **.cgi** extension, instead of displaying the contents of the file, the web server displays the output of running the script.\n", "\n", "This means the output of **pgam.cgi** needs to be *a valid HTML response*.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [], "source": [ "#!/usr/bin/env python3\n", "\n", "print(\"Content-Type: text/html\") # HTML is following\n", "print() # blank line, end of headers\n", "\n", "import cgi\n", "import cgitb\n", "cgitb.enable()\n", "\n", "from pysb.integrate import odesolve\n", "import numpy as np\n", "from model import model\n", "\n", "\n", "print(\"\"\"\n", " \n", "\"\"\")\n", "\n", "form = cgi.FieldStorage()\n", "\n", "time = float(form.getfirst(\"time\",\"1200\"))\n", "model.parameters['INH_0'].value = float(form.getfirst(\"INH_0\", \"500\"))\n", "model.parameters['PG3_0'].value = float(form.getfirst(\"PG3_0\", \" 10000\"))\n", "model.parameters['ADP_0'].value = float(form.getfirst(\"ADP_0\", \" 10000\"))\n", "model.parameters['NADH_0'].value = float(form.getfirst(\"NADH_0\", \"2000\"))\n", "model.parameters['PGM_0'].value = float(form.getfirst(\"PGM_0\", \"14.9\"))\n", "model.parameters['ENO_0'].value = float(form.getfirst(\"ENO_0\", \"2.1\"))\n", "model.parameters['PKM_0'].value = float(form.getfirst(\"PKM_0\", \"0.60\"))\n", "model.parameters['LDH_0'].value = float(form.getfirst(\"LDH_0\", \"0.55\"))\n", "\n", "model.parameters['PGM_PG2kf'].value = float(form.getfirst(\"PGM_PG2kf\", \"0.04312\"))\n", "model.parameters['PGM_PG2kr'].value = float(form.getfirst(\"PGM_PG2kr\", \"0.014426\"))\n", "model.parameters['PGM_PG2kc'].value = float(form.getfirst(\"PGM_PG2kc\", \"0.387171\"))\n", "\n", "model.parameters['ENO_PG3kf'].value = float(form.getfirst(\"ENO_PG3kf\", \"0.011318\"))\n", "model.parameters['ENO_PG3kr'].value = float(form.getfirst(\"ENO_PG3kr\", \"0.013121\"))\n", "model.parameters['ENO_PG3kc'].value = float(form.getfirst(\"ENO_PG3kc\", \"6.706254\"))\n", "\n", "model.parameters['PKM_PEPkf'].value = float(form.getfirst(\"PKM_PEPkf\", \"0.002023\"))\n", "model.parameters['PKM_PEPkr'].value = float(form.getfirst(\"PKM_PEPkr\", \"0.016084\"))\n", "model.parameters['PKM_PEPkc'].value = float(form.getfirst(\"PKM_PEPkc\", \"7.880579\"))\n", "\n", "model.parameters['PKM_ADPkf'].value = float(form.getfirst(\"PKM_ADPkf\", \"0.002023\"))\n", "model.parameters['PKM_ADPkr'].value = float(form.getfirst(\"PKM_ADPkr\", \"0.016084\"))\n", "\n", "model.parameters['LDH_PYRkf'].value = float(form.getfirst(\"LDH_PYRkf\", \"0.029544\"))\n", "model.parameters['LDH_PYRkr'].value = float(form.getfirst(\"LDH_PYRkr\", \"0.009655\"))\n", "model.parameters['LDH_PYRkc'].value = float(form.getfirst(\"LDH_PYRkc\", \"14.775252\"))\n", "\n", "model.parameters['LDH_NADkf'].value = float(form.getfirst(\"LDH_NADkf\", \"0.029544\"))\n", "model.parameters['LDH_NADkr'].value = float(form.getfirst(\"LDH_NADkr\", \"0.009655\"))\n", "\n", "model.parameters['revLDH_PYRkf'].value = float(form.getfirst(\"revLDH_PYRkf\", \"0.00014\"))\n", "model.parameters['revLDH_PYRkr'].value = float(form.getfirst(\"revLDH_PYRkr\", \"20.677645\"))\n", "model.parameters['revLDH_PYRkc'].value = float(form.getfirst(\"revLDH_PYRkc\", \"0.01928\"))\n", "\n", "model.parameters['revLDH_NADkf'].value = float(form.getfirst(\"revLDH_NADkf\", \"0.00014\"))\n", "model.parameters['revLDH_NADkr'].value = float(form.getfirst(\"revLDH_NADkr\", \"20.677645\"))\n", "\n", "\n", "model.parameters['PGM_INHkf'].value = float(form.getfirst(\"PGM_INHkf\", \"0\"))\n", "model.parameters['PGM_INHkr'].value = float(form.getfirst(\"PGM_INHkr\", \"0\"))\n", "\n", "model.parameters['ENO_INHkf'].value = float(form.getfirst(\"ENO_INHkf\", \"0\"))\n", "model.parameters['ENO_INHkr'].value = float(form.getfirst(\"ENO_INHkr\", \"0\"))\n", "\n", "model.parameters['PKM_INHkf'].value = float(form.getfirst(\"PKM_INHkf\", \"0\"))\n", "model.parameters['PKM_INHkr'].value = float(form.getfirst(\"PKM_INHkr\", \"0\"))\n", "\n", "model.parameters['LDH_INHkf'].value = float(form.getfirst(\"LDH_INHkf\", \"0\"))\n", "model.parameters['LDH_INHkr'].value = float(form.getfirst(\"LDH_INHkr\", \"0\"))\n", "\n", "\n", "\n", "t = np.linspace(0,time)\n", "out = odesolve(model, t)\n", "\n", "print(\"\"\"\n", "PGAM Assay Model\n", "\n", "The default parameters were fit to experimental data, as shown here.\n", "
\n", "\n", "\n", "
\n", "INH\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", "\n", "\n", "\n", "\n", "\n", "
\n", "
\n", "PGM\n", "\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", "
\n", "
\n", "ENO\n", "\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "
\n", "PKM\n", "\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", "\n", "\n", "
\n", "LDH\n", "\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", "\n", "\n", "
\n", "Reverse LDH\n", "\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", "\n", "
\n", "
\n", "Initial Amounts\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "
\n", "\n", "
\n", "
\n", "
\n", "

Time

\n", "\n", "\n", "
\n", "\n", "
\n", "\"\"\" % (\n", " model.parameters['PGM_INHkf'].value, model.parameters['PGM_INHkr'].value,\n", " model.parameters['ENO_INHkf'].value, model.parameters['ENO_INHkr'].value,\n", " model.parameters['PKM_INHkf'].value, model.parameters['PKM_INHkr'].value,\n", " model.parameters['LDH_INHkf'].value, model.parameters['LDH_INHkr'].value,\n", " model.parameters['PGM_PG2kf'].value, model.parameters['PGM_PG2kr'].value,model.parameters['PGM_PG2kc'].value,\n", " model.parameters['ENO_PG3kf'].value, model.parameters['ENO_PG3kr'].value,model.parameters['ENO_PG3kc'].value,\n", " model.parameters['PKM_PEPkf'].value, model.parameters['PKM_PEPkr'].value,model.parameters['PKM_PEPkc'].value,\n", " model.parameters['PKM_ADPkf'].value, model.parameters['PKM_ADPkr'].value,\n", " model.parameters['LDH_PYRkf'].value, model.parameters['LDH_PYRkr'].value,model.parameters['LDH_PYRkc'].value,\n", " model.parameters['LDH_NADkf'].value, model.parameters['LDH_NADkr'].value,\n", " model.parameters['revLDH_PYRkf'].value, model.parameters['revLDH_PYRkr'].value,model.parameters['revLDH_PYRkc'].value,\n", " model.parameters['revLDH_NADkf'].value, model.parameters['revLDH_NADkr'].value,\n", "\n", " model.parameters['PGM_0'].value,\n", " model.parameters['ENO_0'].value,\n", " model.parameters['PKM_0'].value,\n", " model.parameters['LDH_0'].value,\n", " model.parameters['INH_0'].value,\n", " model.parameters['PG3_0'].value,\n", " model.parameters['ADP_0'].value,\n", " model.parameters['NADH_0'].value,\n", "\n", " time\n", " )\n", ")\n", "\n", "pg3data = ','.join(np.round(out['oPG3'],2).astype(str))\n", "pg2data = ','.join(np.round(out['oPG2'],2).astype(str))\n", "pepdata = ','.join(np.round(out['oPEP'],2).astype(str))\n", "pyrdata = ','.join(np.round(out['oPYR'],2).astype(str))\n", "lacdata = ','.join(np.round(out['oLAC'],2).astype(str))\n", "nadhdata= ','.join(np.round(out['oNADH'],2).astype(str))\n", "\n", "times = ','.join(np.round(t).astype(str))\n", "\n", "print(\"\"\"\n", "\n", "\n", "
\n", "
\n", "\n", "
\n", "\n", "\n", "\"\"\")\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Configuring CGI\n", "\n", "Most web servers will have CGI disabled by default (or only enable in a specific directory like cgi-bin).\n", "\n", "https://httpd.apache.org/docs/2.4/howto/cgi.html#configuring\n", "\n", "For apache you have to\n", " 1. Enable the cgi module\n", " 2. Allow CGI execution in a given directory\n", " 3. Specify what extensions should be treated as cgi scripts\n", " \n", "\n", "Example apache configuration file:\n", "```\n", " \n", " Options +ExecCGI\n", " AddHandler cgi-script .cgi .py\n", "\n", "```\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# .htaccess\n", "\n", "Apache (and other web servers) can dynamically apply options to a directory based on the contents of a **.htaccess** file in that directory (this feature has to be [enabled](https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride) by the server administrator).\n", "\n", "```\n", "$ cat .htaccess \n", "AddHandler cgi-script .py .cgi\n", "Options +ExecCGI +Indexes\n", "```\n", "\n", "https://httpd.apache.org/docs/2.4/howto/htaccess.html" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Common Problems\n", "\n", "Debugging CGI programs is annoying, as you are not running the program, the webserver is. If there's a problem, the error message returned to the user in the browser is usually generic. More informative error messages *might* be in the logs of the webserver.\n", "\n", " * The code of the script displays instead of the output\n", " * Is CGI enabled on the server?\n", " * Is it enabled on the directory with the script and are the correct handlers configured?\n", " * If a .htaccess file is being used to configure, is the server setup to allow such configuration?\n", " * Internal Server Error \n", " * Look in /var/log/apache2/error.log\n", " * Does the script have the right permissions (must be executable by the webserver user)?\n", " * Does the script print the correct HTTP response lines as its first two lines? (if not, will get malformed header error)\n", " * Does it run as a standalone script (it starts with #!/usr/bin/env python)?\n", " * Does the script have a syntax error? Try running it directly\n", " " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Debugging CGI" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To aid in the debugging of python errors, enable cgitb, which will (sometimes) show the errors in the browser instead of the log files.\n", "\n", "https://docs.python.org/3/library/cgitb.html\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# CGI Input\n", "\n", "Values are provided to CGI programs through GET and PUT requests, most likely those generated using form data.\n", "```\n", "
\n", "
\n", "INH\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "\n", "```\n", "http://bits.csb.pitt.edu/pgammodel/pgam.cgi?PGM_INHkf=0.3&PGM_INHkr=0.2&ENO_INHkf=0.0&ENO_INHkr=0.0&PKM_INHkf=0.0&PKM_INHkr=0.0&LDH_INHkf=0.0&LDH_INHkr=0.0" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# CGI Input\n", "\n", "These values can be accessed through the cgi module (what is happening behind the scenes as they are being set as environment variables before the script is called).\n", "\n", "The **name** from the input element becomes a field." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import cgi\n", "form = cgi.FieldStorage()\n", "\n", "model.parameters['PGM_INHkf'].value = float(form.getfirst(\"PGM_INHkf\", \"0\"))\n", "model.parameters['PGM_INHkr'].value = float(form.getfirst(\"PGM_INHkr\", \"0\"))\n", "\n", "model.parameters['ENO_INHkf'].value = float(form.getfirst(\"ENO_INHkf\", \"0\"))\n", "model.parameters['ENO_INHkr'].value = float(form.getfirst(\"ENO_INHkr\", \"0\"))\n", "\n", "model.parameters['PKM_INHkf'].value = float(form.getfirst(\"PKM_INHkf\", \"0\"))\n", "model.parameters['PKM_INHkr'].value = float(form.getfirst(\"PKM_INHkr\", \"0\"))\n", "\n", "model.parameters['LDH_INHkf'].value = float(form.getfirst(\"LDH_INHkf\", \"0\"))\n", "model.parameters['LDH_INHkr'].value = float(form.getfirst(\"LDH_INHkr\", \"0\"))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# FieldStorage \n", "\n", "* Acts a dictionary (e.g. `form['PKM_INHkf']`), this returns another FieldStorage object\n", "* **.getvalue(name)** return value(s) corresponding to name (list if multiple such values)\n", "* **.getlist(name)** same, but always returns list\n", "* **.getfirst(name,default)** always returns a single value, default if name doesn't exist\n", "\n", "If an item is a file upload (``), getvalue will return contents of object. Can also get file object:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "f = form['filefield'].file" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# CGI Output\n", "\n", "The stdout of the script becomes the source of the web page, but what about images?\n", "\n", "* Can create images on the server and reference their URLs \n", " * could result in a lot of images being generated (archival)\n", " * images viewable by anyone with the URL\n", " * need to be able to write to server\n", "* Can embed images using base64\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "import base64\n", "img = open('imgs/dog.png', 'rb').read()\n", "data = base64.b64encode(img) # returns a byte array\n", "img_tag = ''.format(data.decode())" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "print(img_tag)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%html\n", "
\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Client Side Processing\n", "\n", "Alternatively, as is the case with pgam.cgi, we can generate visualizations on the client side.\n", " * Generate data on the server\n", " * Visualize the data using the browser - supports fast user interaction\n", " \n", "This means we must write some **JavaScript**\n", "\n", "http://bits.csb.pitt.edu/pgammodel/pgam.cgi\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Example (snippet)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print('''\n", "\n", "\n", "
\n", "
\n", "\n", "
\n", "\n", "\n", "
\n", "
\n", "\n", "
\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# The CGI Script" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#!/usr/bin/env python3\n", "\n", "import cgi\n", "import cgitb\n", "from pysb.integrate import odesolve\n", "import numpy as np\n", "from model import model\n", "\n", "cgitb.enable()\n", "\n", "\n", "print(\"Content-Type: text/html\") # HTML is following\n", "print() # blank line, end of headers\n", "\n", "\n", "print(\"\"\"\n", " \n", "\"\"\")\n", "\n", "form = cgi.FieldStorage()\n", "\n", "time = float(form.getfirst(\"time\",\"1200\"))\n", "model.parameters['INH_0'].value = float(form.getfirst(\"INH_0\", \"500\"))\n", "model.parameters['PG3_0'].value = float(form.getfirst(\"PG3_0\", \" 10000\"))\n", "model.parameters['ADP_0'].value = float(form.getfirst(\"ADP_0\", \" 10000\"))\n", "model.parameters['NADH_0'].value = float(form.getfirst(\"NADH_0\", \"2000\"))\n", "model.parameters['PGM_0'].value = float(form.getfirst(\"PGM_0\", \"14.9\"))\n", "model.parameters['ENO_0'].value = float(form.getfirst(\"ENO_0\", \"2.1\"))\n", "model.parameters['PKM_0'].value = float(form.getfirst(\"PKM_0\", \"0.60\"))\n", "model.parameters['LDH_0'].value = float(form.getfirst(\"LDH_0\", \"0.55\"))\n", "\n", "model.parameters['PGM_PG2kf'].value = float(form.getfirst(\"PGM_PG2kf\", \"0.04312\"))\n", "model.parameters['PGM_PG2kr'].value = float(form.getfirst(\"PGM_PG2kr\", \"0.014426\"))\n", "model.parameters['PGM_PG2kc'].value = float(form.getfirst(\"PGM_PG2kc\", \"0.387171\"))\n", "\n", "model.parameters['ENO_PG3kf'].value = float(form.getfirst(\"ENO_PG3kf\", \"0.011318\"))\n", "model.parameters['ENO_PG3kr'].value = float(form.getfirst(\"ENO_PG3kr\", \"0.013121\"))\n", "model.parameters['ENO_PG3kc'].value = float(form.getfirst(\"ENO_PG3kc\", \"6.706254\"))\n", "\n", "model.parameters['PKM_PEPkf'].value = float(form.getfirst(\"PKM_PEPkf\", \"0.002023\"))\n", "model.parameters['PKM_PEPkr'].value = float(form.getfirst(\"PKM_PEPkr\", \"0.016084\"))\n", "model.parameters['PKM_PEPkc'].value = float(form.getfirst(\"PKM_PEPkc\", \"7.880579\"))\n", "\n", "model.parameters['PKM_ADPkf'].value = float(form.getfirst(\"PKM_ADPkf\", \"0.002023\"))\n", "model.parameters['PKM_ADPkr'].value = float(form.getfirst(\"PKM_ADPkr\", \"0.016084\"))\n", "\n", "model.parameters['LDH_PYRkf'].value = float(form.getfirst(\"LDH_PYRkf\", \"0.029544\"))\n", "model.parameters['LDH_PYRkr'].value = float(form.getfirst(\"LDH_PYRkr\", \"0.009655\"))\n", "model.parameters['LDH_PYRkc'].value = float(form.getfirst(\"LDH_PYRkc\", \"14.775252\"))\n", "\n", "model.parameters['LDH_NADkf'].value = float(form.getfirst(\"LDH_NADkf\", \"0.029544\"))\n", "model.parameters['LDH_NADkr'].value = float(form.getfirst(\"LDH_NADkr\", \"0.009655\"))\n", "\n", "model.parameters['revLDH_PYRkf'].value = float(form.getfirst(\"revLDH_PYRkf\", \"0.00014\"))\n", "model.parameters['revLDH_PYRkr'].value = float(form.getfirst(\"revLDH_PYRkr\", \"20.677645\"))\n", "model.parameters['revLDH_PYRkc'].value = float(form.getfirst(\"revLDH_PYRkc\", \"0.01928\"))\n", "\n", "model.parameters['revLDH_NADkf'].value = float(form.getfirst(\"revLDH_NADkf\", \"0.00014\"))\n", "model.parameters['revLDH_NADkr'].value = float(form.getfirst(\"revLDH_NADkr\", \"20.677645\"))\n", "\n", "\n", "model.parameters['PGM_INHkf'].value = float(form.getfirst(\"PGM_INHkf\", \"0\"))\n", "model.parameters['PGM_INHkr'].value = float(form.getfirst(\"PGM_INHkr\", \"0\"))\n", "\n", "model.parameters['ENO_INHkf'].value = float(form.getfirst(\"ENO_INHkf\", \"0\"))\n", "model.parameters['ENO_INHkr'].value = float(form.getfirst(\"ENO_INHkr\", \"0\"))\n", "\n", "model.parameters['PKM_INHkf'].value = float(form.getfirst(\"PKM_INHkf\", \"0\"))\n", "model.parameters['PKM_INHkr'].value = float(form.getfirst(\"PKM_INHkr\", \"0\"))\n", "\n", "model.parameters['LDH_INHkf'].value = float(form.getfirst(\"LDH_INHkf\", \"0\"))\n", "model.parameters['LDH_INHkr'].value = float(form.getfirst(\"LDH_INHkr\", \"0\"))\n", "\n", "\n", "\n", "t = np.linspace(0,time)\n", "out = odesolve(model, t)\n", "\n", "print(\"\"\"\n", "PGAM Assay Model\n", "\n", "The default parameters were fit to experimental data, as shown here.\n", "\n", "\n", "\n", "
\n", "INH\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", "\n", "\n", "\n", "\n", "\n", "
\n", "
\n", "PGM\n", "\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", "
\n", "
\n", "ENO\n", "\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "
\n", "PKM\n", "\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", "\n", "\n", "
\n", "LDH\n", "\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", "\n", "\n", "
\n", "Reverse LDH\n", "\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", " \n", "
\n", "\n", "
\n", "
\n", "Initial Amounts\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "
\n", "\n", "
\n", "
\n", "
\n", "

Time

\n", "\n", "\n", "
\n", "\n", "\n", "\"\"\" % (\n", " model.parameters['PGM_INHkf'].value, model.parameters['PGM_INHkr'].value,\n", " model.parameters['ENO_INHkf'].value, model.parameters['ENO_INHkr'].value,\n", " model.parameters['PKM_INHkf'].value, model.parameters['PKM_INHkr'].value,\n", " model.parameters['LDH_INHkf'].value, model.parameters['LDH_INHkr'].value,\n", " model.parameters['PGM_PG2kf'].value, model.parameters['PGM_PG2kr'].value,model.parameters['PGM_PG2kc'].value,\n", " model.parameters['ENO_PG3kf'].value, model.parameters['ENO_PG3kr'].value,model.parameters['ENO_PG3kc'].value,\n", " model.parameters['PKM_PEPkf'].value, model.parameters['PKM_PEPkr'].value,model.parameters['PKM_PEPkc'].value,\n", " model.parameters['PKM_ADPkf'].value, model.parameters['PKM_ADPkr'].value,\n", " model.parameters['LDH_PYRkf'].value, model.parameters['LDH_PYRkr'].value,model.parameters['LDH_PYRkc'].value,\n", " model.parameters['LDH_NADkf'].value, model.parameters['LDH_NADkr'].value,\n", " model.parameters['revLDH_PYRkf'].value, model.parameters['revLDH_PYRkr'].value,model.parameters['revLDH_PYRkc'].value,\n", " model.parameters['revLDH_NADkf'].value, model.parameters['revLDH_NADkr'].value,\n", "\n", " model.parameters['PGM_0'].value,\n", " model.parameters['ENO_0'].value,\n", " model.parameters['PKM_0'].value,\n", " model.parameters['LDH_0'].value,\n", " model.parameters['INH_0'].value,\n", " model.parameters['PG3_0'].value,\n", " model.parameters['ADP_0'].value,\n", " model.parameters['NADH_0'].value,\n", "\n", " time\n", " ))\n", "\n", "\n", "pg3data = ','.join(np.round(out['oPG3'],2).astype(str))\n", "pg2data = ','.join(np.round(out['oPG2'],2).astype(str))\n", "pepdata = ','.join(np.round(out['oPEP'],2).astype(str))\n", "pyrdata = ','.join(np.round(out['oPYR'],2).astype(str))\n", "lacdata = ','.join(np.round(out['oLAC'],2).astype(str))\n", "nadhdata= ','.join(np.round(out['oNADH'],2).astype(str))\n", "\n", "times = ','.join(np.round(t).astype(str))\n", "\n", "print(\"\"\"\n", "\n", "\n", "
\n", "
\n", "\n", "
\n", "\n", "\n", "\"\"\")\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Project: MadLibs\n", "\n", "Write a website that does MadLibs.\n", " * Ask the user for a noun, verb, and adjective (or more if you want)\n", " * When they click submit, return story using those words\n", " * Do this with *one* script\n", " \n", "```\n", "ssh userid@python.mscbio2025.net\n", "mkdir public_html\n", "chmod +x .\n", "chmod +rx public_html\n", "cd public_html\n", "touch madlibs.py\n", "chmod +x madlibs.py\n", "nano madlibs.py\n", "```\n", "Visit your website at http://python.mscbio2025.net/~userid/" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#!/usr/bin/env python3\n", " \n", "import cgi\n", "\n", "print(\"Content-Type: text/html\\n\")\n", "print(\"Hello!\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Example\n", "\n", "http://python.mscbio2025.net/~dkoes/madlibs.py\n", "\n" ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.6" } }, "nbformat": 4, "nbformat_minor": 2 }