223 lines
6.0 KiB
Markdown
223 lines
6.0 KiB
Markdown
# GetIPDataView Documentation
|
|
|
|
## 📄 **File Location**
|
|
`api/views/GetIPDataView.py`
|
|
|
|
### **Overview**
|
|
Retrieves client IP address information from various HTTP headers and server variables. This view provides comprehensive IP address detection for logging, analytics, and security purposes.
|
|
|
|
### **Class Details**
|
|
|
|
```python
|
|
@permission_classes([AllowAny])
|
|
class GetIPDataView(APIView):
|
|
def get(self, request):
|
|
# Implementation...
|
|
```
|
|
|
|
#### **Permissions**
|
|
- **Access Level**: Public (no authentication required)
|
|
- **Authentication**: None (`@permission_classes([AllowAny])`)
|
|
|
|
### **Method Details**
|
|
|
|
#### **GET /api/get-ip-data/**
|
|
|
|
##### **Description**
|
|
Extracts and returns client IP address information from multiple sources including direct connection, proxy headers, and load balancer information.
|
|
|
|
##### **Parameters**
|
|
No parameters required.
|
|
|
|
##### **Response Format**
|
|
|
|
```json
|
|
{
|
|
"ip_info": {
|
|
"remote_addr": "string",
|
|
"http_x_forwarded_for": "string",
|
|
"http_x_real_ip": "string",
|
|
"http_client_ip": "string",
|
|
"http_x_forwarded": "string",
|
|
"http_x_cluster_client_ip": "string",
|
|
"http_forwarded_for": "string",
|
|
"http_forwarded": "string"
|
|
}
|
|
}
|
|
```
|
|
|
|
##### **Response Field Descriptions**
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `remote_addr` | string | Direct connection IP address |
|
|
| `http_x_forwarded_for` | string | Comma-separated list of IP addresses from proxy chain |
|
|
| `http_x_real_ip` | string | Real client IP as seen by reverse proxy |
|
|
| `http_client_ip` | string | Client IP from custom header |
|
|
| `http_x_forwarded` | string | Forwarded header value |
|
|
| `http_x_cluster_client_ip` | string | Cluster client IP header value |
|
|
| `http_forwarded_for` | string | Standard forwarded for header |
|
|
| `http_forwarded` | string | Standard forwarded header |
|
|
|
|
##### **Usage Examples**
|
|
|
|
**Basic Usage:**
|
|
```bash
|
|
curl -X GET http://your-api.com/api/get-ip-data/
|
|
```
|
|
|
|
**Expected Response:**
|
|
```json
|
|
{
|
|
"ip_info": {
|
|
"remote_addr": "192.168.1.100",
|
|
"http_x_forwarded_for": "203.0.113.50, 198.51.100.25",
|
|
"http_x_real_ip": "203.0.113.50",
|
|
"http_client_ip": "",
|
|
"http_x_forwarded": "",
|
|
"http_x_cluster_client_ip": "",
|
|
"http_forwarded_for": "",
|
|
"http_forwarded": ""
|
|
}
|
|
}
|
|
```
|
|
|
|
**Empty Response Example:**
|
|
```json
|
|
{
|
|
"ip_info": {
|
|
"remote_addr": "",
|
|
"http_x_forwarded_for": "",
|
|
"http_x_real_ip": "",
|
|
"http_client_ip": "",
|
|
"http_x_forwarded": "",
|
|
"http_x_cluster_client_ip": "",
|
|
"http_forwarded_for": "",
|
|
"http_forwarded": ""
|
|
}
|
|
}
|
|
```
|
|
|
|
### **Error Handling**
|
|
|
|
#### **Status Codes**
|
|
- **200 OK**: Request successful, returns IP information
|
|
- **No explicit error handling**: Missing headers return empty strings rather than errors
|
|
|
|
#### **Behavior with Missing Headers**
|
|
When a specific IP header is not present:
|
|
- Returns an empty string (`""`) for that field
|
|
- Does not raise exceptions or return error responses
|
|
- All fields are always present in the response
|
|
|
|
### **Implementation Details**
|
|
|
|
#### **Code Analysis**
|
|
```python
|
|
def get(self, request):
|
|
ip_info = {
|
|
'remote_addr': request.META.get('REMOTE_ADDR'),
|
|
'http_x_forwarded_for': request.META.get('HTTP_X_FORWARDED_FOR'),
|
|
# ... other headers
|
|
}
|
|
|
|
return Response({"ip_info": ip_info}, status=status.HTTP_200_OK)
|
|
```
|
|
|
|
#### **Key Features**
|
|
- ✅ **Non-intrusive**: No side effects on request processing
|
|
- ✅ **Comprehensive**: Checks multiple IP source headers
|
|
- ✅ **Safe**: Gracefully handles missing headers
|
|
- ✅ **Public access**: No authentication required
|
|
- ✅ **Lightweight**: Minimal processing overhead
|
|
|
|
### **Use Cases**
|
|
|
|
#### **Security & Analytics**
|
|
- Log visitor IP addresses for security monitoring
|
|
- Track user location patterns
|
|
- Detect suspicious activity
|
|
|
|
#### **Load Balancer Integration**
|
|
- Extract original client IP behind proxies
|
|
- Support for cloud platforms (AWS, GCP, Azure)
|
|
- Works with CDN configurations
|
|
|
|
#### **Debugging & Development**
|
|
- Verify client connection details
|
|
- Test proxy configurations
|
|
- Debug network routing issues
|
|
|
|
### **⚠️ Important Notes**
|
|
|
|
#### **Header Priority**
|
|
The view checks headers in this order (first found takes precedence):
|
|
1. `REMOTE_ADDR` (most reliable)
|
|
2. `X-Forwarded-For`
|
|
3. `X-Real-IP`
|
|
4. `Client-Ip`
|
|
5. `X-Forwarded`
|
|
6. `X-Cluster-Client-IP`
|
|
7. `Forwarded-For`
|
|
8. `Forwarded`
|
|
|
|
#### **Security Considerations**
|
|
- **Trust Level**: Be cautious when trusting forwarded headers in production
|
|
- **Validation**: Consider validating IP addresses before use
|
|
- **Privacy**: Ensure compliance with data protection regulations
|
|
|
|
#### **Performance Impact**
|
|
- **Minimal**: Only reads existing request metadata
|
|
- **No external calls**: Pure local operation
|
|
- **Constant time**: O(1) complexity regardless of header count
|
|
|
|
### **Integration Examples**
|
|
|
|
#### **Python Client**
|
|
```python
|
|
import requests
|
|
|
|
response = requests.get('http://api.example.com/api/get-ip-data/')
|
|
if response.status_code == 200:
|
|
ip_data = response.json()
|
|
print(f"Client IP: {ip_data['ip_info']['remote_addr']}")
|
|
```
|
|
|
|
#### **JavaScript Frontend**
|
|
```javascript
|
|
fetch('/api/get-ip-data/')
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
console.log('IP Info:', data.ip_info);
|
|
});
|
|
```
|
|
|
|
#### **Django View Integration**
|
|
```python
|
|
from django.http import JsonResponse
|
|
|
|
def some_view(request):
|
|
ip_view = GetIPDataView()
|
|
ip_response = ip_view.get(request)
|
|
# Process IP data as needed
|
|
```
|
|
|
|
### **Testing**
|
|
|
|
#### **Test Cases**
|
|
1. **Direct Connection**: Test without any proxy headers
|
|
2. **Single Proxy**: Test with X-Forwarded-For header
|
|
3. **Multiple Proxies**: Test with comma-separated IPs
|
|
4. **Mixed Headers**: Test with various header combinations
|
|
5. **Missing Headers**: Test with no relevant headers
|
|
|
|
#### **Expected Behavior**
|
|
- Always returns 200 status code
|
|
- Always includes all 8 IP info fields
|
|
- Empty strings for unavailable headers
|
|
- No exceptions or error responses
|
|
|
|
---
|
|
|
|
**Last Updated**: Current Session
|
|
**Version**: 1.0 |