Introduction

In this part 1 of a 4-part series of tutorials on building a basic message board (forum) system, we’re beginning with the Forum Registration with Python, Django, and Postgres as the primary tools. We’ll utilize the Django and Psycopg2 frameworks for opening a browser window, filling that window with content, requesting user input, processing that user input, and various database-related functions. In this part 1, our database-related function we use is to execute an “INSERT INTO” SQL command on our PostgreSQL database.

Overview

We will start out by creating two tables in Postgres, tbl_users and tbl_posts. Next, we will write up an HTML page with a form on it for the user to enter their email address (as username) and password. Then we’ll build an application in Python to use the Render and Request functions in the Django library to send the user to the HTML page and get the user’s submitted data. Finally, we’ll add a hashed version of their password to our database.

Prerequisites

Before you begin learning how to use the Django framework, you’ll want to first understand the basics of Python use. Fortunately, there are a gazillion resources on the web for this, including articles and free video tutorials. Here’s an invaluable resource: https://www.python.org.

There is more than one IDE out there a programmer can use to write and test Python applications, including the two most popular, PyCharm and VS Code. Having used both, this programmer prefers VS Code. Bonus: It’s free. Get it here: https://code.visualstudio.com 

Depending how new you are to Python and Django, you can try looking at the following overview or skip down to where we build a simple application. First, be sure not to skip installing the Django library for your Python code to include (import).

Postgres tables for forum

Create a table for managing users

[et_pb_dmb_code_snippet code=”Q1JFQVRFIFRBQkxFIHRibF91c2VycyAoCglpZCBzZXJpYWwgTk9UIE5VTEwKCSwgaWRfc2Vzc2lvbiBpbnQ0IE5VTEwKCSwgdF9lbWFpbF9hZGRyIHZhcmNoYXIoMTI4KSBOVUxMCgksIHRfcGFzc3dvcmQgdmFyY2hhcigyNTYpIE5VTEwKCSwgdF9uYW1lX3VzZXIgdmFyY2hhcig2NCkgTlVMTAoJLCB0X25hbWVfZmlyc3QgdmFyY2hhcig2NCkgTlVMTAoJLCB0X25hbWVfbGFzdCB2YXJjaGFyKDY0KSBOVUxMCgksIHRfYWRkcl9pcCB2YXJjaGFyKDMyKSBOVUxMCgksIGRfdmlzaXRfZmlyc3QgZGF0ZSBOVUxMIERFRkFVTFQgbm93KCkKCSwgZF92aXNpdF9sYXN0IGRhdGUgTlVMTAoJLCBiX2VuYWJsZWQgYm9vbCBOVUxMCglDT05TVFJBSU5UIHRibF91c2Vyc19wa2V5IFBSSU1BUlkgS0VZIChpZCkKKTsKQ1JFQVRFIFVOSVFVRSBJTkRFWCB0YmxfdXNlcnNfaWRfaWR4IE9OIHRibF91c2VycyBVU0lORyBidHJlZSAoaWQpOw==” _builder_version=”4.4.8″]Q1JFQVRFIFRBQkxFIHRibF91c2VycyAoCglpZCBzZXJpYWwgTk9UIE5VTEwKCSwgaWRfc2Vzc2lvbiBpbnQ0IE5VTEwKCSwgdF9lbWFpbF9hZGRyIHZhcmNoYXIoMTI4KSBOVUxMCgksIHRfcGFzc3dvcmQgdmFyY2hhcigyNTYpIE5VTEwKCSwgdF9uYW1lX3VzZXIgdmFyY2hhcig2NCkgTlVMTAoJLCB0X25hbWVfZmlyc3QgdmFyY2hhcig2NCkgTlVMTAoJLCB0X25hbWVfbGFzdCB2YXJjaGFyKDY0KSBOVUxMCgksIHRfYWRkcl9pcCB2YXJjaGFyKDMyKSBOVUxMCgksIGRfdmlzaXRfZmlyc3QgZGF0ZSBOVUxMIERFRkFVTFQgbm93KCkKCSwgZF92aXNpdF9sYXN0IGRhdGUgTlVMTAoJLCBiX2VuYWJsZWQgYm9vbCBOVUxMCglDT05TVFJBSU5UIHRibF91c2Vyc19wa2V5IFBSSU1BUlkgS0VZIChpZCkKKTsKQ1JFQVRFIFVOSVFVRSBJTkRFWCB0YmxfdXNlcnNfaWRfaWR4IE9OIHRibF91c2VycyBVU0lORyBidHJlZSAoaWQpOw==[/et_pb_dmb_code_snippet]

NOTE: In the above SQL for creating your users table, we went a little bit “overkill” but recommend – even though we won’t be using many of these columns in the current simple forum system we’re building – you will most likely want those fields later on if you choose to enhance your message board system with more features.

Create table for storing posts

[et_pb_dmb_code_snippet code=”Q1JFQVRFIFRBQkxFIHRibF9wb3N0cyAoCglpZCBzZXJpYWwgTk9UIE5VTEwKCSwgaWRfc2Vzc2lvbiBpbnQ0IE5VTEwgREVGQVVMVCAwCgksIGlkX3BhcmVudCBpbnQ0IE5VTEwgREVGQVVMVCAwCgksIGlkX3VzZXIgaW50NCBOVUxMIERFRkFVTFQgMAogICAgLCB0X3N1YmplY3RfdG9waWMgdmFyY2hhcigyNTUpIE5VTEwKCSwgdF9wb3N0IHZhcmNoYXIoMjU1KSBOVUxMCgksIHRfbm90ZSB2YXJjaGFyKDI1NSkgTlVMTAoJLCBpX29yZGVyIGludDQgTlVMTCBERUZBVUxUIDAKCSwgaV91cHZvdGVzIGludDQgTlVMTCBERUZBVUxUIDAKCSwgZF9idWlsdCBkYXRlIE5VTEwgREVGQVVMVCBub3coKQogICAgLCBkX2NoYW5nZWQgZGF0ZSBOVUxMIERFRkFVTFQgbm93KCkKKTs=” _builder_version=”4.4.8″]Q1JFQVRFIFRBQkxFIHRibF9wb3N0cyAoCglpZCBzZXJpYWwgTk9UIE5VTEwKCSwgaWRfc2Vzc2lvbiBpbnQ0IE5VTEwgREVGQVVMVCAwCgksIGlkX3BhcmVudCBpbnQ0IE5VTEwgREVGQVVMVCAwCgksIGlkX3VzZXIgaW50NCBOVUxMIERFRkFVTFQgMAogICAgLCB0X3N1YmplY3RfdG9waWMgdmFyY2hhcigyNTUpIE5VTEwKCSwgdF9wb3N0IHZhcmNoYXIoMjU1KSBOVUxMCgksIHRfbm90ZSB2YXJjaGFyKDI1NSkgTlVMTAoJLCBpX29yZGVyIGludDQgTlVMTCBERUZBVUxUIDAKCSwgaV91cHZvdGVzIGludDQgTlVMTCBERUZBVUxUIDAKCSwgZF9idWlsdCBkYXRlIE5VTEwgREVGQVVMVCBub3coKQogICAgLCBkX2NoYW5nZWQgZGF0ZSBOVUxMIERFRkFVTFQgbm93KCkKKTs=[/et_pb_dmb_code_snippet]

NOTES: As with the users table, we have included some columns in tbl_posts that won’t be used in our simple messaging system but you’ll probably need to have later if you expand your application with more features. One such column is id_parent. If you want messages to be able to refer to other messages – multi-threading – then you will want this field.

 

Django HTML template

Below is a minimal representation of HTML for a registration screen for our simple forum system. Name this file “forumRegistration.html”:

[et_pb_dmb_code_snippet code=”PGh0bWw+CjxoZWFkPgogICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJmYXZpY29uLmljbyI+CiAgICA8dGl0bGU+UmVnaXN0cmF0aW9uPC90aXRsZT4KICAgIDxzdHlsZT4KICAgIGJvZHkge2JhY2tncm91bmQtY29sb3I6ICNFMkUyRTI7fQogICAgaDEge2ZvbnQtc2l6ZTogMzJwdDt9CiAgICAuZGl2LXByaW1hcnkge21hcmdpbjogYXV0bzsgcGFkZGluZy1sZWZ0OiAyMHB4OyBwYWRkaW5nLXJpZ2h0OiAyMHB4O30KICAgIC5mcm0taW5wdXQtY2FwdGlvbiB7dGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogNHB4O30KICAgIC5mcm0taW5wdXQtaW5wdXQge3RleHQtYWxpZ246IGxlZnQ7fQogICAgLmZybS1idG4tc2F2ZSB7dGV4dC1hbGlnbjogbGVmdDt9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRTJFMkUyOyI+CjwhLS0gV2l0aCAidF9tc2dfZnJvbV9zZXJ2ZXIiIGluIGN1cmx5IGJyYWNrZXRzIGJlbG93OiAtLT4KPCEtLSBJdCBpcyBwaWVjZSBvZiB3aHkgd2UgY2FsbCB0aGlzIHBhZ2UgImR5bmFtaWMiIG9yIGEgInRlbXBsYXRlIiAtLT4KPCEtLSBUaGlzIHBhZ2UgaXMgY29uc2lkZXJlZCBkeW5hbWljIGJlY2F1c2U6IC0tPgo8IS0tIFRoZSBzZXJ2ZXIgY2FuIGZpbGwgaW4gYXQgdGhlIHNwb3Qgd2hlcmUgeW91IHNlZSB7e3RfbXNnX2Zyb21fc2VydmVyfX0gLS0+CjwhLS0gd2l0aCB0aGUgcGFyYW1ldGVyIHZhbHVlIHlvdSBzZW50IHdoZW4gd2UgdXNlZCBEamFuZ28ncyAtLT4KPCEtLSByZW5kZXIoImZvcnVtUmVnaXN0cmF0aW9uLmh0bWwiLCB0X21zZ19mcm9tX3NlcnZlciA9ICJBIG1lc3NhZ2UiKSAtLT4KPGgxPnt7dF9tc2dfZnJvbV9zZXJ2ZXJ9fTwvaDE+CjxkaXY+CiAgICA8IS0tIFNldCB1cCB0aGUgaW5wdXQgZm9ybSB0byByZWNlaXZlIHVzZXIgaW5wdXQgLS0+CiAgICA8IS0tIG1ldGhvZD0ncG9zdCcgc2VuZHMgdGhlIGRhdGEgYXMgYSBwb3N0IGZvciBEamFuZ28ncyBSZXF1ZXN0KCkgZnVuY3Rpb24gdG8gcmVjZWl2ZS4gLS0+CiAgICA8Zm9ybSBpZD0nZnJtLXJlZ2lzdHJhdGlvbicgbmFtZT0nZnJtLXJlZ2lzdHJhdGlvbicgYWN0aW9uPScnIG1ldGhvZD0ncG9zdCcgb25zdWJtaXQ9J3JldHVybiB0cnVlOyc+IHslIGNzcmZfdG9rZW4gJX0KCjwhLS0gdGhlICJjc3JmX3Rva2VuIiB5b3Ugc2VlIGFib3ZlIGlzIGp1c3QgdG8gcHJldmVudCBDcm9zcy1zaXRlIFJlcXVlc3QgRm9yZ2VyeSAoQ1NSRikgYXR0YWNrIG9uIHlvdXIgc2l0ZS4tLT4KCiAgICA8IS0tIElucHV0IGJveCBmb3IgdGhlIGZvcnVtIHVzZXIgdG8gdHlwZSB0aGVpciBlbWFpbCBhZGRyZXNzLiAtLT4KICAgIDwhLS0gVGhlIElucHV0IHRhZyBoYXMgYSAnbmFtZScgcGFyYW1ldGVyIG9mICd0X2VtYWlsX2FkZHInLiAtLT4KICAgIDwhLS0gU28gb3VyIHJlcXVlc3QgZnVuY3Rpb24gYmFjayBpbiBQeXRob24gY2FuIHVzZSAndF9lbWFpbF9hZGRyJyAtLT4KICAgIDwhLS0gICB0byByZWNlaXZlIGRhdGEgdGhlIHVzZXIgdHlwZWQgaW4gdGhpcyBmaWVsZC4gLS0+CiAgICA8ZGl2IGNsYXNzPSJmcm0tcmVjb3JkIj4KICAgIDxkaXYgY2xhc3M9ImZybS1pbnB1dC1jYXB0aW9uIj5FbWFpbCBhZGRyZXNzOjwvZGl2PgogICAgPGRpdiBjbGFzcz0iZnJtLWlucHV0LWlucHV0Ij48aW5wdXQgdHlwZT0idGV4dCIgIG5hbWU9InRfZW1haWxfYWRkciI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJmcm0tcmVjb3JkIj4KICAgIDxkaXYgY2xhc3M9ImZybS1pbnB1dC1jYXB0aW9uIj5QYXNzd29yZDo8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImZybS1pbnB1dC1pbnB1dCI+PGlucHV0IHR5cGU9InRleHQiICBuYW1lPSJ0X3Bhc3N3b3JkIj48L2Rpdj4KICAgIDwvZGl2PgoKICAgIDwhLS0gU3VibWl0IGJ1dHRvbiBmb3IgdGhlIHVzZXIgdG8gc2VuZCB0aGUgZm9ybSAtLT4KICAgIDxkaXY+CiAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJmcm0tYnRuLXNhdmUiIG5hbWU9ImJ0bl9hZGRfdXNlcl9nbyIgdmFsdWU9J1JlZ2lzdGVyJz4KICAgIDwvZGl2PgoKICAgIDwhLS0gQ2xvc2UgZm9ybSB0YWcgLS0+CiAgICA8L2Zvcm0+CjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4=” _builder_version=”4.4.8″]PGh0bWw+CjxoZWFkPgogICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJmYXZpY29uLmljbyI+CiAgICA8dGl0bGU+UmVnaXN0cmF0aW9uPC90aXRsZT4KICAgIDxzdHlsZT4KICAgIGJvZHkge2JhY2tncm91bmQtY29sb3I6ICNFMkUyRTI7fQogICAgaDEge2ZvbnQtc2l6ZTogMzJwdDt9CiAgICAuZGl2LXByaW1hcnkge21hcmdpbjogYXV0bzsgcGFkZGluZy1sZWZ0OiAyMHB4OyBwYWRkaW5nLXJpZ2h0OiAyMHB4O30KICAgIC5mcm0taW5wdXQtY2FwdGlvbiB7dGV4dC1hbGlnbjogcmlnaHQ7IG1hcmdpbi1yaWdodDogNHB4O30KICAgIC5mcm0taW5wdXQtaW5wdXQge3RleHQtYWxpZ246IGxlZnQ7fQogICAgLmZybS1idG4tc2F2ZSB7dGV4dC1hbGlnbjogbGVmdDt9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRTJFMkUyOyI+CjwhLS0gV2l0aCAidF9tc2dfZnJvbV9zZXJ2ZXIiIGluIGN1cmx5IGJyYWNrZXRzIGJlbG93OiAtLT4KPCEtLSBJdCBpcyBwaWVjZSBvZiB3aHkgd2UgY2FsbCB0aGlzIHBhZ2UgImR5bmFtaWMiIG9yIGEgInRlbXBsYXRlIiAtLT4KPCEtLSBUaGlzIHBhZ2UgaXMgY29uc2lkZXJlZCBkeW5hbWljIGJlY2F1c2U6IC0tPgo8IS0tIFRoZSBzZXJ2ZXIgY2FuIGZpbGwgaW4gYXQgdGhlIHNwb3Qgd2hlcmUgeW91IHNlZSB7e3RfbXNnX2Zyb21fc2VydmVyfX0gLS0+CjwhLS0gd2l0aCB0aGUgcGFyYW1ldGVyIHZhbHVlIHlvdSBzZW50IHdoZW4gd2UgdXNlZCBEamFuZ28ncyAtLT4KPCEtLSByZW5kZXIoImZvcnVtUmVnaXN0cmF0aW9uLmh0bWwiLCB0X21zZ19mcm9tX3NlcnZlciA9ICJBIG1lc3NhZ2UiKSAtLT4KPGgxPnt7dF9tc2dfZnJvbV9zZXJ2ZXJ9fTwvaDE+CjxkaXY+CiAgICA8IS0tIFNldCB1cCB0aGUgaW5wdXQgZm9ybSB0byByZWNlaXZlIHVzZXIgaW5wdXQgLS0+CiAgICA8IS0tIG1ldGhvZD0ncG9zdCcgc2VuZHMgdGhlIGRhdGEgYXMgYSBwb3N0IGZvciBEamFuZ28ncyBSZXF1ZXN0KCkgZnVuY3Rpb24gdG8gcmVjZWl2ZS4gLS0+CiAgICA8Zm9ybSBpZD0nZnJtLXJlZ2lzdHJhdGlvbicgbmFtZT0nZnJtLXJlZ2lzdHJhdGlvbicgYWN0aW9uPScnIG1ldGhvZD0ncG9zdCcgb25zdWJtaXQ9J3JldHVybiB0cnVlOyc+IHslIGNzcmZfdG9rZW4gJX0KCjwhLS0gdGhlICJjc3JmX3Rva2VuIiB5b3Ugc2VlIGFib3ZlIGlzIGp1c3QgdG8gcHJldmVudCBDcm9zcy1zaXRlIFJlcXVlc3QgRm9yZ2VyeSAoQ1NSRikgYXR0YWNrIG9uIHlvdXIgc2l0ZS4tLT4KCiAgICA8IS0tIElucHV0IGJveCBmb3IgdGhlIGZvcnVtIHVzZXIgdG8gdHlwZSB0aGVpciBlbWFpbCBhZGRyZXNzLiAtLT4KICAgIDwhLS0gVGhlIElucHV0IHRhZyBoYXMgYSAnbmFtZScgcGFyYW1ldGVyIG9mICd0X2VtYWlsX2FkZHInLiAtLT4KICAgIDwhLS0gU28gb3VyIHJlcXVlc3QgZnVuY3Rpb24gYmFjayBpbiBQeXRob24gY2FuIHVzZSAndF9lbWFpbF9hZGRyJyAtLT4KICAgIDwhLS0gICB0byByZWNlaXZlIGRhdGEgdGhlIHVzZXIgdHlwZWQgaW4gdGhpcyBmaWVsZC4gLS0+CiAgICA8ZGl2IGNsYXNzPSJmcm0tcmVjb3JkIj4KICAgIDxkaXYgY2xhc3M9ImZybS1pbnB1dC1jYXB0aW9uIj5FbWFpbCBhZGRyZXNzOjwvZGl2PgogICAgPGRpdiBjbGFzcz0iZnJtLWlucHV0LWlucHV0Ij48aW5wdXQgdHlwZT0idGV4dCIgIG5hbWU9InRfZW1haWxfYWRkciI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJmcm0tcmVjb3JkIj4KICAgIDxkaXYgY2xhc3M9ImZybS1pbnB1dC1jYXB0aW9uIj5QYXNzd29yZDo8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImZybS1pbnB1dC1pbnB1dCI+PGlucHV0IHR5cGU9InRleHQiICBuYW1lPSJ0X3Bhc3N3b3JkIj48L2Rpdj4KICAgIDwvZGl2PgoKICAgIDwhLS0gU3VibWl0IGJ1dHRvbiBmb3IgdGhlIHVzZXIgdG8gc2VuZCB0aGUgZm9ybSAtLT4KICAgIDxkaXY+CiAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJmcm0tYnRuLXNhdmUiIG5hbWU9ImJ0bl9hZGRfdXNlcl9nbyIgdmFsdWU9J1JlZ2lzdGVyJz4KICAgIDwvZGl2PgoKICAgIDwhLS0gQ2xvc2UgZm9ybSB0YWcgLS0+CiAgICA8L2Zvcm0+CjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4=[/et_pb_dmb_code_snippet]

In the form above we mentioned Django’s Request function. Now we learn how to use it.

Django request from HTML

The first function we’ll examine is the “request” function, which is used to pull data that was submitted either by form “post” or by a querystring “get”.

 

Django Request Syntax

[et_pb_dmb_code_snippet code=”IyBJbiB0aGlzIGFwcGxpY2F0aW9uLCB3ZSdyZSBub3QgdXNpbmcgdGhlIHF1ZXJ5c3RyaW5nIHZlcnNpb24gb2YgcmVxdWVzdCBidXQgYXJlIGxlYXZpbmcgaXQgaGVyZSBmb3IgeW91IHRvIHNlZSBob3cgaXQgd29ya3MuCnZhbHVlX2Zyb21fcXVlcnlzdHJpbmcgPSByZXF1ZXN0LmdldFtmaWVsZF9pbl9xdWVyeXN0cmluZ10KIyBUSElTIGlzIHRoZSB2ZXJzaW9uIG9mIHJlcXVlc3Qgd2UgaGF2ZSB1c2VkIGZvciBvdXIgZm9ydW0gc3lzdGVtOgp2YWx1ZV9mcm9tX2Zvcm1fcG9zdCA9IHJlcXVlc3QucG9zdFtmaWVsZF9pbl9mb3JtX3Bvc3Rd” _builder_version=”4.4.8″]IyBJbiB0aGlzIGFwcGxpY2F0aW9uLCB3ZSdyZSBub3QgdXNpbmcgdGhlIHF1ZXJ5c3RyaW5nIHZlcnNpb24gb2YgcmVxdWVzdCBidXQgYXJlIGxlYXZpbmcgaXQgaGVyZSBmb3IgeW91IHRvIHNlZSBob3cgaXQgd29ya3MuCnZhbHVlX2Zyb21fcXVlcnlzdHJpbmcgPSByZXF1ZXN0LmdldFtmaWVsZF9pbl9xdWVyeXN0cmluZ10KIyBUSElTIGlzIHRoZSB2ZXJzaW9uIG9mIHJlcXVlc3Qgd2UgaGF2ZSB1c2VkIGZvciBvdXIgZm9ydW0gc3lzdGVtOgp2YWx1ZV9mcm9tX2Zvcm1fcG9zdCA9IHJlcXVlc3QucG9zdFtmaWVsZF9pbl9mb3JtX3Bvc3Rd[/et_pb_dmb_code_snippet]

Analysis

– field_in_querystring: This determines the name of the field being submitted; how it was named in a querystring or where method=retrieve in the HTML form. GETs are tacked on to the URL.
– field_in_form_post: This is the field name being submitted via the HTML form where “method” is set to “post” like you see in the form tag of the HTML we wrote above.
– default value if empty: If no value was submitted by the user for that field because they left the input text field empty, this is the value that will be received in the value_from_form_post piece of the equation we showed you in the syntax above. For strings, we might put an empty string here, like “”. For numeric, we might put a zero in this spot.

Let’s examine how it works:

Django Request Examples

An example of how we might use Django’s Request function can be used in the “real world”, like for example, in creating a forum system or message board:

[et_pb_dmb_code_snippet code=”dF9lbWFpbF9hZGRyID0gcmVxdWVzdC5wb3N0WyJ0X2VtYWlsX2FkZHIiXQp0X3Bhc3N3b3JkID0gcmVxdWVzdC5wb3N0WyJ0X3Bhc3N3b3JkIl0=” _builder_version=”4.4.8″]dF9lbWFpbF9hZGRyID0gcmVxdWVzdC5wb3N0WyJ0X2VtYWlsX2FkZHIiXQp0X3Bhc3N3b3JkID0gcmVxdWVzdC5wb3N0WyJ0X3Bhc3N3b3JkIl0=[/et_pb_dmb_code_snippet]

Analysis

– t_email_addr: This pulls (requests) the value the user entered into the HTML input tag called “t_email_addr” and places that value in the Python variable we also named “t_email_addr”.

 

Django render

Python Django’s Render function sends an HTML page to the user’s browser. Render can be filled with dynamic content by sending parameters with the function, including, especially, the document or HTML to be displayed.

Django Render Example

Note: Render needs the Django library, so you want to add the two import lines you see in the example code below.

[et_pb_dmb_code_snippet code=”aW1wb3J0IERqYW5nbwpmcm9tIGRqYW5nby5zaG9ydGN1dHMgaW1wb3J0IHJlbmRlcgptc2cgPSAiVGV4dCB0byBzZW5kIHRvIGJlIGRpc3BsYXllZCBhcyBkeW5hbWljIgpyZXR1cm4gcmVuZGVyKHJlcXVlc3QsICJmb3J1bVJlZ2lzdHJhdGlvbi5odG1sIiwgeyJ0X21zZ19mcm9tX3NlcnZlciIgOiBtc2d9KQ==” _builder_version=”4.4.8″]aW1wb3J0IERqYW5nbwpmcm9tIGRqYW5nby5zaG9ydGN1dHMgaW1wb3J0IHJlbmRlcgptc2cgPSAiVGV4dCB0byBzZW5kIHRvIGJlIGRpc3BsYXllZCBhcyBkeW5hbWljIgpyZXR1cm4gcmVuZGVyKHJlcXVlc3QsICJmb3J1bVJlZ2lzdHJhdGlvbi5odG1sIiwgeyJ0X21zZ19mcm9tX3NlcnZlciIgOiBtc2d9KQ==[/et_pb_dmb_code_snippet]

Analysis

– t_msg_from_server: The value we placed in “t_msg_from_server” is sent to forumRegistration.html, the dynamic html page we developed above, that receives and displays t_msg_from_server. Note: instead of using “t_msg_from_server”, you can name this variable anything you want and even include more parameters within the render function.

 

Skipped Hashing

We recommend you include hashing the user’s password before storing in the database. We’ll include this in the source code at the bottom of this article.

 

Psycopg2 insert into Postgres

[et_pb_dmb_code_snippet _builder_version=”4.4.8″ code=”cyA9ICIiCnMgKz0gIklOU0VSVCBJTlRPIHRibF91c2VycyAiCnMgKz0gIigiCnMgKz0gIiB0X2VtYWlsX2FkZHIiCnMgKz0gIix0X3Bhc3N3b3JkIgpzICs9ICIpIFZBTFVFUyAoIgpzICs9ICIgJygldF9lbWFpbF9hZGRyKSciCnMgKz0gIiwnKCV0X3Bhc3N3b3JkKSciCnMgKz0gIikiCmRiX2N1cnNvci5leGVjdXRlKHMsIFt0X2VtYWlsX2FkZHIsIHRfcGFzc3dvcmRdKQ==” hover_enabled=”0″]cyA9ICIiCnMgKz0gIklOU0VSVCBJTlRPIHRibF91c2VycyAiCnMgKz0gIigiCnMgKz0gIiB0X2VtYWlsX2FkZHIiCnMgKz0gIix0X3Bhc3N3b3JkIgpzICs9ICIpIFZBTFVFUyAoIgpzICs9ICIgJygldF9lbWFpbF9hZGRyKSciCnMgKz0gIiwnKCV0X3Bhc3N3b3JkKSciCnMgKz0gIikiCmRiX2N1cnNvci5leGVjdXRlKHMsIFt0X2VtYWlsX2FkZHIsIHRfcGFzc3dvcmRdKQ==[/et_pb_dmb_code_snippet]

Here above we created a parameterized query with SQL. Now let’s examine the full Python source code for a Forum-type messaging system.

 

Full Source Code in Python

[et_pb_dmb_code_snippet _builder_version=”4.4.8″ code=”IyBMaWJyYXJpZXMgdG8gaW1wb3J0CmltcG9ydCBEamFuZ28KZnJvbSBkamFuZ28uc2hvcnRjdXRzIGltcG9ydCByZW5kZXIKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IHBzeWNvcGcyCgojIFJvdXRpbmcKYXBwID0gRGphbmdvKF9fbmFtZV9fKQpAYXBwLnJvdXRlKCIvcmVnaXN0ZXIiLCBtZXRob2RzPVsiUE9TVCIsIkdFVCJdKQoKIyBEYXRhYmFzZSBjb25uZWN0aW9uIGNvZGUKdF9ob3N0ID0gImRhdGFiYXNlIGhvc3QgYWRkcmVzcyIKdF9wb3J0ID0gIjU0MjMiCnRfZGJuYW1lID0gImRhdGFiYXNlIG5hbWUiCnRfdXNlciA9ICJkYXRhYmFzZSB1c2VyIG5hbWUiCnRfcHcgPSAicGFzc3dvcmQiCmRiX2Nvbm4gPSBwc3ljb3BnMi5jb25uZWN0KGhvc3Q9dF9ob3N0LCBwb3J0PXRfcG9ydCwgZGJuYW1lPXRfZGJuYW1lLCB1c2VyPXRfdXNlciwgcGFzc3dvcmQ9dF9wdykKZGJfY3Vyc29yID0gZGJfY29ubi5jdXJzb3IoKQoKIyBGdW5jdGlvbiBmb3IgcmVnaXN0cmF0aW9uCmRlZiByZWdpc3RlcigpOgogICAgIyBTaG93IHVzZXIgdGhlIHRlbXBsYXRlIHdlIGNyZWF0ZWQKICAgIHJldHVybiByZW5kZXIoImZvcnVtUmVnaXN0cmF0aW9uLmh0bWwiLCB7InRfbXNnX2Zyb21fc2VydmVyIiA6ICJSZWdpc3RlciB0byB1c2UgdGhlIGZvcnVtIn0pCiAgICB0X2VtYWlsX2FkZHIgPSByZXF1ZXN0LnBvc3RbInRfZW1haWxfYWRkciJdCiAgICB0X3Bhc3N3b3JkID0gcmVxdWVzdC5wb3N0WyJ0X3Bhc3N3b3JkIl0KCiAgICAjIENoZWNrIGZvciBlbXB0eSBpbiB1c2VyIG5hbWUgZmllbGQKICAgIGlmIHRfZW1haWxfYWRkciA9PSAiIjoKICAgICAgICB0X21zZ19mcm9tX3NlcnZlciA9ICJFbXB0eSBmaWVsZDogRmlsbCBpbiBhbiBlbWFpbCBhZGRyZXNzLiIKICAgICAgICAjIElmIGVtcHR5OiBTZW5kIHRoZW0gYmFjayB0byB0aGUgaHRtbCBwYWdlIHdpdGggYSBtZXNzYWdlCiAgICAgICAgcmV0dXJuIHJlbmRlcigiZm9ydW1SZWdpc3RyYXRpb24uaHRtbCIsIHsidF9tc2dfZnJvbV9zZXJ2ZXIiIDogdF9tc2dfZnJvbV9zZXJ2ZXJ9KQoKICAgICMgQ2hlY2sgZm9yIGVtcHR5IGluIHBhc3N3b3JkIGZpZWxkCiAgICBpZiB0X3Bhc3N3b3JkID09ICIiOgogICAgICAgIHRfbXNnX2Zyb21fc2VydmVyID0gIlBsZWFzZSBmaWxsIGluIGEgcGFzc3dvcmQiCiAgICAgICAgcmV0dXJuIHJlbmRlcigiZm9ydW1SZWdpc3RyYXRpb24uaHRtbCIsIHsidF9tc2dfZnJvbV9zZXJ2ZXIiIDogdF9tc2dfZnJvbV9zZXJ2ZXJ9KQoKICAgICMgUGFzc3dvcmQgaGFzaGluZyBsaWtlIHdlIG1lbnRpb25lZCBlYXJsaWVyCiAgICB0X2hhc2hlZCA9IGhhc2hsaWIuc2hhMjU2KHRfcGFzc3dvcmQuZW5jb2RlKCkpCiAgICB0X3Bhc3N3b3JkID0gdF9oYXNoZWQuaGV4ZGlnZXN0KCkKCiAgICAjIEFkZCB0aGUgdXNlciB0byBQb3N0Z3JlU1FMCiAgICBzID0gIiIKICAgIHMgKz0gIklOU0VSVCBJTlRPIHRibF91c2VycyAiCiAgICBzICs9ICIoIgogICAgcyArPSAiIHRfZW1haWxfYWRkciIKICAgIHMgKz0gIix0X3Bhc3N3b3JkIgogICAgcyArPSAiKSBWQUxVRVMgKCIKICAgIHMgKz0gIiAnKCV0X2VtYWlsX2FkZHIpJyIKICAgIHMgKz0gIiwnKCV0X3Bhc3N3b3JkKSciCiAgICBzICs9ICIpIgogICAgIyBFcnJvciBjaGVja2luZy90cmFwcGluZwogICAgdHJ5OgogICAgICAgIGRiX2N1cnNvci5leGVjdXRlKHMsIFt0X2VtYWlsX2FkZHIsIHRfcGFzc3dvcmRdKQogICAgICAgIGRiX2Nvbm4uY29tbWl0KCkKICAgIGV4Y2VwdCBwc3ljb3BnMi5FcnJvciBhcyBlOgogICAgICAgIHRfbXNnX2Zyb21fc2VydmVyID0gIlNRTCBlcnJvcjogIiArIGUgKyAiL24gU1FMOiAiICsgcwogICAgICAgICMgQWdhaW4gdXNpbmcgdGVtcGxhdGVzIHRvIHNob3cgdGhlIHVzZXIgYSBtZXNzYWdlLgogICAgICAgICMgVGhpcyBwYXJ0aWN1bGFyIG9uZSBoZWxwcyB0aGUgZGV2ZWxvcGVyIGZpZ3VyZSBvdXQKICAgICAgICAjICAgIGFueSBkYXRhYmFzZSBlcnJvcnMgdGhhdCBtaWdodCBvY2N1ciB1cG9uIHRyeWluZyB0bwogICAgICAgICMgICAgYWRkIGEgdXNlciB0byBvdXIgZGF0YWJhc2UuCiAgICAgICAgcmV0dXJuIHJlbmRlcigiZm9ydW1SZWdpc3RyYXRpb24uaHRtbCIsIHsidF9tc2dfZnJvbV9zZXJ2ZXIiIDogdF9tc2dfZnJvbV9zZXJ2ZXJ9KQogICAgZGJfY3Vyc29yLmNsb3NlKCk=” hover_enabled=”0″]IyBMaWJyYXJpZXMgdG8gaW1wb3J0CmltcG9ydCBEamFuZ28KZnJvbSBkamFuZ28uc2hvcnRjdXRzIGltcG9ydCByZW5kZXIKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IHBzeWNvcGcyCgojIFJvdXRpbmcKYXBwID0gRGphbmdvKF9fbmFtZV9fKQpAYXBwLnJvdXRlKCIvcmVnaXN0ZXIiLCBtZXRob2RzPVsiUE9TVCIsIkdFVCJdKQoKIyBEYXRhYmFzZSBjb25uZWN0aW9uIGNvZGUKdF9ob3N0ID0gImRhdGFiYXNlIGhvc3QgYWRkcmVzcyIKdF9wb3J0ID0gIjU0MjMiCnRfZGJuYW1lID0gImRhdGFiYXNlIG5hbWUiCnRfdXNlciA9ICJkYXRhYmFzZSB1c2VyIG5hbWUiCnRfcHcgPSAicGFzc3dvcmQiCmRiX2Nvbm4gPSBwc3ljb3BnMi5jb25uZWN0KGhvc3Q9dF9ob3N0LCBwb3J0PXRfcG9ydCwgZGJuYW1lPXRfZGJuYW1lLCB1c2VyPXRfdXNlciwgcGFzc3dvcmQ9dF9wdykKZGJfY3Vyc29yID0gZGJfY29ubi5jdXJzb3IoKQoKIyBGdW5jdGlvbiBmb3IgcmVnaXN0cmF0aW9uCmRlZiByZWdpc3RlcigpOgogICAgIyBTaG93IHVzZXIgdGhlIHRlbXBsYXRlIHdlIGNyZWF0ZWQKICAgIHJldHVybiByZW5kZXIoImZvcnVtUmVnaXN0cmF0aW9uLmh0bWwiLCB7InRfbXNnX2Zyb21fc2VydmVyIiA6ICJSZWdpc3RlciB0byB1c2UgdGhlIGZvcnVtIn0pCiAgICB0X2VtYWlsX2FkZHIgPSByZXF1ZXN0LnBvc3RbInRfZW1haWxfYWRkciJdCiAgICB0X3Bhc3N3b3JkID0gcmVxdWVzdC5wb3N0WyJ0X3Bhc3N3b3JkIl0KCiAgICAjIENoZWNrIGZvciBlbXB0eSBpbiB1c2VyIG5hbWUgZmllbGQKICAgIGlmIHRfZW1haWxfYWRkciA9PSAiIjoKICAgICAgICB0X21zZ19mcm9tX3NlcnZlciA9ICJFbXB0eSBmaWVsZDogRmlsbCBpbiBhbiBlbWFpbCBhZGRyZXNzLiIKICAgICAgICAjIElmIGVtcHR5OiBTZW5kIHRoZW0gYmFjayB0byB0aGUgaHRtbCBwYWdlIHdpdGggYSBtZXNzYWdlCiAgICAgICAgcmV0dXJuIHJlbmRlcigiZm9ydW1SZWdpc3RyYXRpb24uaHRtbCIsIHsidF9tc2dfZnJvbV9zZXJ2ZXIiIDogdF9tc2dfZnJvbV9zZXJ2ZXJ9KQoKICAgICMgQ2hlY2sgZm9yIGVtcHR5IGluIHBhc3N3b3JkIGZpZWxkCiAgICBpZiB0X3Bhc3N3b3JkID09ICIiOgogICAgICAgIHRfbXNnX2Zyb21fc2VydmVyID0gIlBsZWFzZSBmaWxsIGluIGEgcGFzc3dvcmQiCiAgICAgICAgcmV0dXJuIHJlbmRlcigiZm9ydW1SZWdpc3RyYXRpb24uaHRtbCIsIHsidF9tc2dfZnJvbV9zZXJ2ZXIiIDogdF9tc2dfZnJvbV9zZXJ2ZXJ9KQoKICAgICMgUGFzc3dvcmQgaGFzaGluZyBsaWtlIHdlIG1lbnRpb25lZCBlYXJsaWVyCiAgICB0X2hhc2hlZCA9IGhhc2hsaWIuc2hhMjU2KHRfcGFzc3dvcmQuZW5jb2RlKCkpCiAgICB0X3Bhc3N3b3JkID0gdF9oYXNoZWQuaGV4ZGlnZXN0KCkKCiAgICAjIEFkZCB0aGUgdXNlciB0byBQb3N0Z3JlU1FMCiAgICBzID0gIiIKICAgIHMgKz0gIklOU0VSVCBJTlRPIHRibF91c2VycyAiCiAgICBzICs9ICIoIgogICAgcyArPSAiIHRfZW1haWxfYWRkciIKICAgIHMgKz0gIix0X3Bhc3N3b3JkIgogICAgcyArPSAiKSBWQUxVRVMgKCIKICAgIHMgKz0gIiAnKCV0X2VtYWlsX2FkZHIpJyIKICAgIHMgKz0gIiwnKCV0X3Bhc3N3b3JkKSciCiAgICBzICs9ICIpIgogICAgIyBFcnJvciBjaGVja2luZy90cmFwcGluZwogICAgdHJ5OgogICAgICAgIGRiX2N1cnNvci5leGVjdXRlKHMsIFt0X2VtYWlsX2FkZHIsIHRfcGFzc3dvcmRdKQogICAgICAgIGRiX2Nvbm4uY29tbWl0KCkKICAgIGV4Y2VwdCBwc3ljb3BnMi5FcnJvciBhcyBlOgogICAgICAgIHRfbXNnX2Zyb21fc2VydmVyID0gIlNRTCBlcnJvcjogIiArIGUgKyAiL24gU1FMOiAiICsgcwogICAgICAgICMgQWdhaW4gdXNpbmcgdGVtcGxhdGVzIHRvIHNob3cgdGhlIHVzZXIgYSBtZXNzYWdlLgogICAgICAgICMgVGhpcyBwYXJ0aWN1bGFyIG9uZSBoZWxwcyB0aGUgZGV2ZWxvcGVyIGZpZ3VyZSBvdXQKICAgICAgICAjICAgIGFueSBkYXRhYmFzZSBlcnJvcnMgdGhhdCBtaWdodCBvY2N1ciB1cG9uIHRyeWluZyB0bwogICAgICAgICMgICAgYWRkIGEgdXNlciB0byBvdXIgZGF0YWJhc2UuCiAgICAgICAgcmV0dXJuIHJlbmRlcigiZm9ydW1SZWdpc3RyYXRpb24uaHRtbCIsIHsidF9tc2dfZnJvbV9zZXJ2ZXIiIDogdF9tc2dfZnJvbV9zZXJ2ZXJ9KQogICAgZGJfY3Vyc29yLmNsb3NlKCk=[/et_pb_dmb_code_snippet]

Conclusion

In this first of a multi-tutorial document series for creating a message board, we developed Forum Registration with Python and Postgres. We used the Django and Psycopg2 libraries for request, render, and various database-related functions.