Skip to content

Commit ff1c881

Browse files
committed
add web assistant tutorial with gpt3.5 api
1 parent 1a20e5e commit ff1c881

32 files changed

+338
-0
lines changed

Diff for: README.md

+1
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ This is a repository of all the tutorials of [The Python Code](https://www.thepy
237237
- [How to Make a Blog using Django in Python](https://www.thepythoncode.com/article/create-a-blog-using-django-in-python). ([code](https://github.com/chepkiruidorothy/simple-blog-site))
238238
- [How to Make a Todo App using Django in Python](https://www.thepythoncode.com/article/build-a-todo-app-with-django-in-python). ([code](https://github.com/chepkiruidorothy/todo-app-simple/tree/master))
239239
- [How to Build an Email Address Verifier App using Django in Python](https://www.thepythoncode.com/article/build-an-email-verifier-app-using-django-in-python). ([code](web-programming/webbased-emailverifier))
240+
- [How to Build a Web Assistant Using Django and OpenAI GPT-3.5 API in Python](https://www.thepythoncode.com/article/web-assistant-django-with-gpt3-api-python). ([code](web-programming/webassistant))
240241

241242
- ### [GUI Programming](https://www.thepythoncode.com/topic/gui-programming)
242243
- [How to Make a Text Editor using Tkinter in Python](https://www.thepythoncode.com/article/text-editor-using-tkinter-python). ([code](gui-programming/text-editor))

Diff for: web-programming/webassistant/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# [How to Build a Web Assistant Using Django and OpenAI GPT-3.5 API in Python](https://www.thepythoncode.com/article/web-assistant-django-with-gpt3-api-python)

Diff for: web-programming/webassistant/assistant/__init__.py

Whitespace-only changes.

Diff for: web-programming/webassistant/assistant/admin.py

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from django.contrib import admin
2+
3+
# Register your models here.

Diff for: web-programming/webassistant/assistant/apps.py

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.apps import AppConfig
2+
3+
4+
class AssistantConfig(AppConfig):
5+
default_auto_field = 'django.db.models.BigAutoField'
6+
name = 'assistant'

Diff for: web-programming/webassistant/assistant/migrations/__init__.py

Whitespace-only changes.
Binary file not shown.
Binary file not shown.

Diff for: web-programming/webassistant/assistant/models.py

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from django.db import models
2+
3+
# Create your models here.

Diff for: web-programming/webassistant/assistant/secret_key.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
API_KEY = 'put your API key here'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{% extends 'assistant/base.html' %}
2+
3+
{% block title %} 404 {% endblock %}
4+
5+
{% block content %}
6+
<div class="row justify-content-center my-4">
7+
8+
<div class="col-md-7 mt-4">
9+
<h1>Page Not Found</h1>
10+
<p>Make sure you are connected to the internet or your query is correct</p>
11+
<a href="{% url 'home' %}" class="btn btn-secondary">Go Home</a>
12+
</div>
13+
14+
</div>
15+
16+
{% endblock %}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
7+
<title>Web Assistant | {% block title %} {% endblock %}</title>
8+
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
9+
</head>
10+
<body>
11+
{% block content %}
12+
{% endblock %}
13+
</body>
14+
</html>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{% extends 'assistant/base.html' %}
2+
3+
{% block title %} Home {% endblock %}
4+
5+
{% block content %}
6+
<div class="row justify-content-center my-4">
7+
8+
<div class="col-md-7 mt-4">
9+
10+
<div class="card">
11+
<h1 class="card-header text-center">A.I WEB ASSISTANT</h1>
12+
13+
<div class="card-body">
14+
15+
<pre>Hello, am your web assistant here to help you, what's on your mind?</pre>
16+
17+
<form action="." method="POST">
18+
<!-- this secures the form from malicious attacks during submission -->
19+
{% csrf_token %}
20+
21+
<input class="form-control mb-2" required type="text" autofocus="autofocus" name="prompt" value="{{ prompt }}" id="">
22+
23+
<button class="btn btn-success fw-bold" type="submit">
24+
GENARATE
25+
</button>
26+
27+
</form>
28+
29+
<hr>
30+
31+
<pre>
32+
{{ formatted_response }}
33+
</pre>
34+
35+
</div>
36+
37+
</div>
38+
39+
</div>
40+
41+
</div>
42+
</div>
43+
{% endblock %}

Diff for: web-programming/webassistant/assistant/tests.py

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from django.test import TestCase
2+
3+
# Create your tests here.

Diff for: web-programming/webassistant/assistant/urls.py

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# here we are import path from in-built django-urls
2+
from django.urls import path
3+
# here we are importing all the Views from the views.py file
4+
from . import views
5+
6+
# a list of all the urls
7+
urlpatterns = [
8+
path('home/', views.home, name='home'),
9+
path('error-handler/', views.error_handler, name='error_handler'),
10+
]

Diff for: web-programming/webassistant/assistant/views.py

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# importing render and redirect
2+
from django.shortcuts import render, redirect
3+
# importing the openai API
4+
import openai
5+
# import the generated API key from the secret_key file
6+
from .secret_key import API_KEY
7+
8+
9+
# loading the API key from the secret_key file
10+
openai.api_key = API_KEY
11+
12+
13+
# this is the home view for handling home page logic
14+
def home(request):
15+
# the try statement is for sending request to the API and getting back the response
16+
# formatting it and rendering it in the template
17+
try:
18+
# checking if the request method is POST
19+
if request.method == 'POST':
20+
# getting prompt data from the form
21+
prompt = request.POST.get('prompt')
22+
# making a request to the API
23+
response = openai.Completion.create(model="text-davinci-003", prompt=prompt, temperature=1, max_tokens=1000)
24+
# formatting the response input
25+
formatted_response = response['choices'][0]['text']
26+
# bundling everything in the context
27+
context = {
28+
'formatted_response': formatted_response,
29+
'prompt': prompt
30+
}
31+
# this will render the results in the home.html template
32+
return render(request, 'assistant/home.html', context)
33+
# this runs if the request method is GET
34+
else:
35+
# this will render when there is no request POST or after every POST request
36+
return render(request, 'assistant/home.html')
37+
38+
# the except statement will capture any error
39+
except:
40+
# this will redirect to the 404 page after any error is caught
41+
return redirect('error_handler')
42+
43+
44+
# this is the view for handling errors
45+
def error_handler(request):
46+
return render(request, 'assistant/404.html')

Diff for: web-programming/webassistant/db.sqlite3

128 KB
Binary file not shown.

Diff for: web-programming/webassistant/manage.py

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/usr/bin/env python
2+
"""Django's command-line utility for administrative tasks."""
3+
import os
4+
import sys
5+
6+
7+
def main():
8+
"""Run administrative tasks."""
9+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webassistant.settings')
10+
try:
11+
from django.core.management import execute_from_command_line
12+
except ImportError as exc:
13+
raise ImportError(
14+
"Couldn't import Django. Are you sure it's installed and "
15+
"available on your PYTHONPATH environment variable? Did you "
16+
"forget to activate a virtual environment?"
17+
) from exc
18+
execute_from_command_line(sys.argv)
19+
20+
21+
if __name__ == '__main__':
22+
main()

Diff for: web-programming/webassistant/requirements.txt

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
openai
2+
django

Diff for: web-programming/webassistant/webassistant/__init__.py

Whitespace-only changes.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Diff for: web-programming/webassistant/webassistant/asgi.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"""
2+
ASGI config for webassistant project.
3+
4+
It exposes the ASGI callable as a module-level variable named ``application``.
5+
6+
For more information on this file, see
7+
https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/
8+
"""
9+
10+
import os
11+
12+
from django.core.asgi import get_asgi_application
13+
14+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webassistant.settings')
15+
16+
application = get_asgi_application()
+125
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
"""
2+
Django settings for webassistant project.
3+
4+
Generated by 'django-admin startproject' using Django 4.1.5.
5+
6+
For more information on this file, see
7+
https://docs.djangoproject.com/en/4.1/topics/settings/
8+
9+
For the full list of settings and their values, see
10+
https://docs.djangoproject.com/en/4.1/ref/settings/
11+
"""
12+
13+
from pathlib import Path
14+
15+
# Build paths inside the project like this: BASE_DIR / 'subdir'.
16+
BASE_DIR = Path(__file__).resolve().parent.parent
17+
18+
19+
# Quick-start development settings - unsuitable for production
20+
# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/
21+
22+
# SECURITY WARNING: keep the secret key used in production secret!
23+
SECRET_KEY = 'django-insecure-w48hsbn$3hi4f46&cc@(3uqrqp60(e&gzm99vc!qvv2x@59fa5'
24+
25+
# SECURITY WARNING: don't run with debug turned on in production!
26+
DEBUG = True
27+
28+
ALLOWED_HOSTS = []
29+
30+
31+
# Application definition
32+
33+
INSTALLED_APPS = [
34+
'django.contrib.admin',
35+
'django.contrib.auth',
36+
'django.contrib.contenttypes',
37+
'django.contrib.sessions',
38+
'django.contrib.messages',
39+
'django.contrib.staticfiles',
40+
# registering the new app
41+
'assistant',
42+
]
43+
44+
MIDDLEWARE = [
45+
'django.middleware.security.SecurityMiddleware',
46+
'django.contrib.sessions.middleware.SessionMiddleware',
47+
'django.middleware.common.CommonMiddleware',
48+
'django.middleware.csrf.CsrfViewMiddleware',
49+
'django.contrib.auth.middleware.AuthenticationMiddleware',
50+
'django.contrib.messages.middleware.MessageMiddleware',
51+
'django.middleware.clickjacking.XFrameOptionsMiddleware',
52+
]
53+
54+
ROOT_URLCONF = 'webassistant.urls'
55+
56+
TEMPLATES = [
57+
{
58+
'BACKEND': 'django.template.backends.django.DjangoTemplates',
59+
'DIRS': [],
60+
'APP_DIRS': True,
61+
'OPTIONS': {
62+
'context_processors': [
63+
'django.template.context_processors.debug',
64+
'django.template.context_processors.request',
65+
'django.contrib.auth.context_processors.auth',
66+
'django.contrib.messages.context_processors.messages',
67+
],
68+
},
69+
},
70+
]
71+
72+
WSGI_APPLICATION = 'webassistant.wsgi.application'
73+
74+
75+
# Database
76+
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases
77+
78+
DATABASES = {
79+
'default': {
80+
'ENGINE': 'django.db.backends.sqlite3',
81+
'NAME': BASE_DIR / 'db.sqlite3',
82+
}
83+
}
84+
85+
86+
# Password validation
87+
# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators
88+
89+
AUTH_PASSWORD_VALIDATORS = [
90+
{
91+
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
92+
},
93+
{
94+
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
95+
},
96+
{
97+
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
98+
},
99+
{
100+
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
101+
},
102+
]
103+
104+
105+
# Internationalization
106+
# https://docs.djangoproject.com/en/4.1/topics/i18n/
107+
108+
LANGUAGE_CODE = 'en-us'
109+
110+
TIME_ZONE = 'UTC'
111+
112+
USE_I18N = True
113+
114+
USE_TZ = True
115+
116+
117+
# Static files (CSS, JavaScript, Images)
118+
# https://docs.djangoproject.com/en/4.1/howto/static-files/
119+
120+
STATIC_URL = 'static/'
121+
122+
# Default primary key field type
123+
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field
124+
125+
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

Diff for: web-programming/webassistant/webassistant/urls.py

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from django.contrib import admin
2+
from django.urls import path, include
3+
4+
# a list of all the projects urls
5+
urlpatterns = [
6+
# the url to the admin site
7+
path('admin/', admin.site.urls),
8+
# registering all the assistant application urls
9+
path('webassistant/', include('assistant.urls')),
10+
]

Diff for: web-programming/webassistant/webassistant/wsgi.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"""
2+
WSGI config for webassistant project.
3+
4+
It exposes the WSGI callable as a module-level variable named ``application``.
5+
6+
For more information on this file, see
7+
https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/
8+
"""
9+
10+
import os
11+
12+
from django.core.wsgi import get_wsgi_application
13+
14+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webassistant.settings')
15+
16+
application = get_wsgi_application()

0 commit comments

Comments
 (0)