Introduction

In this part 4 of a multi-piece series for building a messaging system, we set up the ability for the user to make a forum post with Python and Postgres as the primary tools. We’ll utilize the Django and Psycopg2 frameworks for request, render, and other database-related functions. In this tutorial document, the main database-related function we use is to execute an “INSERT INTO” SQL command to add a post to our database.

Prerequisites

See parts 1 through 3, where we developed the underlying Postgres tables, a registration form, and the SQL and Python application needed for user registration: Use Django for Forum Registration with Python and Postgres: https://oceanmedia.net/use-django-for-a-forum-part-1-registration

Django forum messages lesson overview

We will start out by building an HTML page that will have an HTML form in it that the user can use to type in a message they need to be posted. Next, we’ll build a Python application that uses Request and Render to send the user to the HTML page as well as get the user’s submitted data. Finally, we’ll insert their new message into tbl_posts.

 

Django HTML page 

Below is the HTML for a posting screen for our forum messaging system. Name this file “post.html”:

[et_pb_dmb_code_snippet code=”PGZvcm0gaWQ9J2Zvcm1fcG9zdCcgbmFtZT0nZm9ybV9wb3N0JyBhY3Rpb249Jy9yZXBseVBvc3Q/aWRfdXNlcj17e2lkX3VzZXJ9fSZpZF9wYXJlbnQ9e3tpZF9tZXNzYWdlfX0nIG1ldGhvZD0ncG9zdCcgb25zdWJtaXQ9J3JldHVybiB0cnVlOyc+CjxkaXYgY2xhc3M9ImZybS1yZWNvcmQiPgo8ZGl2IGNsYXNzPSJmcm0taW5wdXQtY2FwdGlvbiI+VG9waWM6PC9kaXY+CjxkaXYgY2xhc3M9ImZybS1pbnB1dC1pbnB1dCI+PGlucHV0IHR5cGU9InRleHQiICBuYW1lPSJ0X3N1YmplY3RfdG9waWMiPjwvZGl2Pgo8L2Rpdj4KPGRpdiBjbGFzcz0iZnJtLXJlY29yZCI+CiAgIAk8ZGl2IGNsYXNzPSJmcm0taW5wdXQtY2FwdGlvbiI+WW91ciBtZXNzYWdlOjwvZGl2PgogICAJPGRpdiBjbGFzcz0iZnJtLWlucHV0LWlucHV0Ij48dGV4dGFyZWEgbmFtZT0idF9wb3N0Ij48L3RleHRhcmVhPjwvZGl2Pgo8L2Rpdj4KPGRpdj4KIAk8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iZnJtLWJ0bi1zYXZlIiBuYW1lPSJidG5fYWRkX3VzZXJfZ28iIHZhbHVlPSdSZWdpc3Rlcic+CjwvZGl2Pgo8L2Zvcm0+” _builder_version=”4.4.8″]PGZvcm0gaWQ9J2Zvcm1fcG9zdCcgbmFtZT0nZm9ybV9wb3N0JyBhY3Rpb249Jy9yZXBseVBvc3Q/aWRfdXNlcj17e2lkX3VzZXJ9fSZpZF9wYXJlbnQ9e3tpZF9tZXNzYWdlfX0nIG1ldGhvZD0ncG9zdCcgb25zdWJtaXQ9J3JldHVybiB0cnVlOyc+CjxkaXYgY2xhc3M9ImZybS1yZWNvcmQiPgo8ZGl2IGNsYXNzPSJmcm0taW5wdXQtY2FwdGlvbiI+VG9waWM6PC9kaXY+CjxkaXYgY2xhc3M9ImZybS1pbnB1dC1pbnB1dCI+PGlucHV0IHR5cGU9InRleHQiICBuYW1lPSJ0X3N1YmplY3RfdG9waWMiPjwvZGl2Pgo8L2Rpdj4KPGRpdiBjbGFzcz0iZnJtLXJlY29yZCI+CiAgIAk8ZGl2IGNsYXNzPSJmcm0taW5wdXQtY2FwdGlvbiI+WW91ciBtZXNzYWdlOjwvZGl2PgogICAJPGRpdiBjbGFzcz0iZnJtLWlucHV0LWlucHV0Ij48dGV4dGFyZWEgbmFtZT0idF9wb3N0Ij48L3RleHRhcmVhPjwvZGl2Pgo8L2Rpdj4KPGRpdj4KIAk8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iZnJtLWJ0bi1zYXZlIiBuYW1lPSJidG5fYWRkX3VzZXJfZ28iIHZhbHVlPSdSZWdpc3Rlcic+CjwvZGl2Pgo8L2Zvcm0+[/et_pb_dmb_code_snippet]

The form above is displayed via Django’s render function and the data is getd via Django’s Request function.

Django Render

Django’s Render function sends an HTML page to the user’s view. Render can use dynamic content by sending parameters with the function. The server will incorporate the dynamic content into the page and send the resulting HTML on to the client browser. PHP and Classic ASP work in an almost identical manner.

Django Render Example

 

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

Analysis

– t_post: The text we placed in the “t_post” parameter is sent to post.html, the html page we developed above, that receives and displays t_post in the h1 tag. Note: rather than use “t_post”, you can call this variable anything and even include multiple parameters within the render Django function.

 

Django request from HTML

The “request” function is used to pull data that was submitted either by form “post” or by a querystring “get”. In this lesson we have used it to request from a form post. 

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

 Analysis

– **field_name_from_get**: This is the name of the field submitted; how it was named in a querystring or where method = ‘get’ in the form. GET is added to the end of a URL.
– **field_name_from_post**: This is the field name submitted via the form where method = ‘post’ like you see in the form tag of the HTML above.
– **default value when empty**: If an empty or null value was submitted by the user for the field because they left the field empty, this is the value that will be received in the value_gotten_from_form_post piece we showed you in the syntax above.

Let’s take a examine how that works with an applicable example:

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=”dF9zdWJqZWN0X3RvcGljID0gcmVxdWVzdC5wb3N0WyJ0X3N1YmplY3RfdG9waWMiLCAiIikKdF9wb3N0ID0gcmVxdWVzdC5wb3N0WyJ0X3Bvc3QiLCAiIik=” _builder_version=”4.4.8″]dF9zdWJqZWN0X3RvcGljID0gcmVxdWVzdC5wb3N0WyJ0X3N1YmplY3RfdG9waWMiLCAiIikKdF9wb3N0ID0gcmVxdWVzdC5wb3N0WyJ0X3Bvc3QiLCAiIik=[/et_pb_dmb_code_snippet]

Analysis

– t_subject_topic: Gets the value the user entered into the HTML input tag called “t_subject_topic” and places that value in the Python variable we also named “t_subject_topic”.
– t_post: Gets the value the user entered into the HTML textarea tag called “t_post” and places that value in the Python variable we also named “t_post”.

Now for a brief examine inserting this data into Postgres:

 

Postgres Insert Row

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

Because we care about security from hacking, we used a parameterized query for our SQL and used psycopg2’s cursor object and execute method.

Finally, let’s write the full Python source code for our messaging system.

 

Full Source Code in Python

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

Conclusion

In this final part (4) of a four-part series of tutorials for creating a messaging application, we enabled the user to make a forum post with Python and Postgres as the primary tools. We utilized the Django and Psycopg2 frameworks for request, render, and some other database-related features. In this tutorial document, the main “new” database-related function we learned to use was the “INSERT INTO” SQL command, executed to add a post to our database as a new row.