I am trying to make an IP Logger plus URL shortener.
It says problem with line 82 in views.py - store_links.save()
Getting an error: NOT NULL constraint failed: MyServer_links.redirect_url
What I have tried:
**views.py**
1 from django.shortcuts import render,redirect
2 from django.http import HttpResponse
3 from django.http import JsonResponse
4 from django.http import HttpResponseRedirect
5 from django.views.decorators.csrf import csrf_exempt
6 from MyServer.models import *
7
8
9 import string
10 import random
11 import re
12 from datetime import datetime
13 import json
14 import os
15
16
17
18 TRACKING_DOMAIN_NAME = '127.0.0.1:8000'
19 DOMAIN_NAME = '127.0.0.1:8000'
20
21
22
23
24 def formaturl(url):
25 if not re.match('(?:http|ftp|https)://', url):
26 return 'http://{}'.format(url)
27 return url
28
29
30 def get_client_ip(request):
31 x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
32 if x_forwarded_for:
33 ip = x_forwarded_for.split(',')[0]
34 else:
35 ip = request.META.get('REMOTE_ADDR')
36 return ip
37
38
39 def get_client_data(request):
40 browser = request.user_agent.browser.family + " "+ request.user_agent.browser.version_string
41 os = request.user_agent.os.family + " "+ request.user_agent.os.version_string
42 device = request.user_agent.device.family
43
44 device_type=""
45
46 if(request.user_agent.is_mobile):
47 device_type="Mobile"
48
49 if(request.user_agent.is_tablet):
50 device_type="Tablet"
51
52 if(request.user_agent.is_pc):
53 device_type="PC/Laptop"
54
55 if(request.user_agent.is_bot):
56 device="bot"
57
58 resp = {"browser":browser,"os":os,"device_type":device_type,"device":device}
59
60 print(resp)
61 return resp
62
63
64
65 @csrf_exempt
66 def create_shortened_url(request):
67 original_url = request.GET.get('127.0.0.1:8000')
68
69 random_chars = ''.join(random.choices(string.ascii_uppercase + string.digits, k = 6))
70 random_chars2 = ''.join(random.choices(string.ascii_uppercase + string.digits, k = 5))
71
72
73 shortened_link = DOMAIN_NAME + "/" + random_chars
74 tracking_link = TRACKING_DOMAIN_NAME + "/" + random_chars2
75
76
77
78
79
80
81 store_links = Links(short_url=shortened_link,redirect_url=original_url,tracking_url=tracking_link)
82 store_links.save()
83
84 print("LINK SHORTENED : ",shortened_link)
85
86 return render(request,'index.html',context={'shortened_link':shortened_link,'tracking_link':tracking_link})
87
88
89 def redirect_test(request):
90 return redirect("https://facebook.com")
91
92 def ip_test(request):
93 return HttpResponse(get_client_ip(request))
94
95 def user_agent_test(request):
96 browser = request.user_agent.browser.family
97 os = request.user_agent.os.family
98 device = request.user_agent.device.family
99
100 if(request.user_agent.is_pc):
101 device = "PC"
102 return HttpResponse(browser+"\n"+os+" "+device)
103
104
105 def redirect_now(request,short_link):
106 shortened_link = DOMAIN_NAME + "/" + short_link.strip()
107
108
109 fetched = Links.objects.filter(short_url=shortened_link).first()
110
111 redirect_url = formaturl(fetched.redirect_url)
112
113 client_data = get_client_data(request)
114
115 now = datetime.now()
116 dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
117
118
119
120 log_data = TrackingData(tracking_url=fetched.tracking_url,short_url=shortened_link,
121 ip_address=get_client_ip(request),browser=client_data['browser'],os=client_data['os']
122 ,device_type=client_data['device_type'],device=client_data['device'],time=dt_string)
123
124 log_data.save()
125
126
127 return redirect(redirect_url)
128
129
130 def fetch_tracking_data(request,tracking_link):
131 tracking_url = TRACKING_DOMAIN_NAME + "/" + tracking_link.strip()
132 fetch = TrackingData.objects.filter(tracking_url=tracking_url)
133
134 res = []
135 k = 1
136 for row in fetch:
137
138 temp = {}
139 temp['ip_address'] = row.ip_address
140 temp['browser'] = row.browser
141 temp['os'] = row.os
142 temp['device_type'] = row.device_type
143 temp['device'] = row.device
144 temp['time'] = row.time
145
146 res.append(temp)
147
148
149
150
151
152
153 print("resp : ",res)
154 return render(request,'tracking_display.html',{'resp':res,'shortened_link':fetch[0].short_url})
155
156
157 def home(request):
158 return render(request,'index.html')
159 ```
160
161 **models.py**
162
163 ```from django.db import models
164
165
166
167 class Links(models.Model):
168 short_url = models.CharField(max_length = 100)
169 redirect_url = models.TextField()
170 tracking_url = models.CharField(max_length = 100)
171
172
173 class TrackingData(models.Model):
174 tracking_url = models.CharField(max_length=100)
175 short_url = models.CharField(max_length=100)
176 ip_address = models.TextField()
177 browser = models.TextField()
178 os = models.TextField()
179 device_type = models.TextField()
180 device = models.TextField()
181 time = models.TextField()
182 ```
183
184 **manage.py**
185 ```
186 """Django's command-line utility for administrative tasks."""
187 import os
188 import sys
189
190
191 def main()
193 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'IPLoggerServer.settings')
194 try:
195 from django.core.management import execute_from_command_line
196 except ImportError as exc:
197 raise ImportError(
198 "Couldn't import Django. Are you sure it's installed and "
199 "available on your PYTHONPATH environment variable? Did you "
200 "forget to activate a virtual environment?"
201 ) from exc
202 execute_from_command_line(sys.argv)
203
204
205 if __name__ == '__main__':
206 main()
207 ```
208
209 **apps.py**
210 ```
211 from django.apps import AppConfig
212
213
214 class MyserverConfig(AppConfig):
215 name = 'MyServer'