Django Concepts
Published: 2023-04-04 10:46:43

## 1. Settings file

### What is secret key?
Django uses a secret key as a string to ensure secure cryptographic signing and encryption of sensitive data such as cookies and session information. It is crucial to keep the key confidential and not reveal it to the public.

### What are the default Django apps inside it? Are there more?
Django has a set of built-in apps that include admin, auth, contenttypes, sessions, and messages. These apps offer a range of essential features such as user authentication, session management, content types, messaging, and administration interface.

Apart from these, there are various other official Django apps that can be utilized, such as caching, file storage, database routing, form handling, and so on. Furthermore, there are numerous third-party Django apps available that can be installed and integrated to enhance the capabilities of a Django project.


### What is middleware? What are different kinds of middleware?
Middleware is a feature in Django that allows you to change the requests and responses between the web server and your application. There are different types of middleware that can be used for different purposes. Some middleware can modify incoming requests, some can modify the response generated by the view function, some can handle exceptions that occur during processing, and some can modify the response after it has been generated. Middleware is a way to change the behavior of your application without modifying its core functionality.

Different Kind of middleware
* Process Request Middleware: modifies incoming requests before they are passed to view functions.
* View Middleware: modifies the response generated by the view function before it is returned to the user.
* Process Exception Middleware: handles exceptions that occur during the processing of a request.
* Process Response Middleware: modifies the response after it has been generated by the view function but before it is returned to the user.

### Django Security
Django offers various security features to assist developers in creating secure web applications. These features include protection against cross-site scripting (XSS) attacks by automatically escaping user input, prevention against cross-site request forgery (CSRF) attacks using CSRF tokens, safeguarding against SQL injection attacks through ORM, prevention of clickjacking attacks using X-Frame-Options header, password hashing using the PBKDF2 algorithm, session management for preventing session hijacking, and support for HTTPS connections.

### CSRF
A CSRF attack happens when a hacker tricks a person into doing something on a different website where they are already signed in. The bad website sends a harmful request to the real website using the person's already-signed-in account. This allows the attacker to take actions using the person's account without their knowledge. To stop CSRF attacks, developers can use techniques such as adding special tokens to forms or making the person confirm before doing important actions.

### XSS
XSS is a type of web attack where hackers can put harmful code into a website that other people visit. This code can then be used to steal sensitive information, like passwords, or to do things without the user knowing. To stop XSS attacks, developers can make sure any input from users is cleaned up and made safe, and use special tools to stop the harmful code from working. Using tools like Django can also help protect against XSS attacks.

### Clickjacking
Clickjacking is a type of online attack where a harmful website tricks a user into clicking on a hidden or camouflaged link or button on a different website where the user is already logged in. This is done by overlapping an unseen or partly visible element, such as a button or link, on top of a genuine website, causing the user to unintentionally click on the hidden element. Techniques like frame-busting scripts or configuring the X-Frame-Options header can help prevent clickjacking attacks.


### What is WSGI?
WSGI is an interface between web servers and Python-based web applications or frameworks that enables the development of web applications in Python that can run on any WSGI-compatible web server. This interface specification provides flexibility and portability for web applications.

## 2. Models file

### What is ondelete Cascade?
When defining a ForeignKey field in Django, the on_delete parameter specifies the action to be taken when the referenced object is deleted. on_delete has different options like CASCADE, PROTECT, SET_NULL, SET_DEFAULT, SET(), and DO_NOTHING. CASCADE is one of the options that instructs Django to delete all objects that have a foreign key pointing to the deleted object. This is useful for maintaining data consistency in database relationships.


### Fields and Validators
Fields in Django refer to the data types that define the structure of a database table. Validators, on the other hand, are functions that validate the data entered into those fields. For instance, CharField can be used as a field to store character strings, and a validator can be used to check that the input data meets certain requirements such as minimum or maximum length. Validators can also verify specific patterns or formats, such as email address or phone number. By utilizing fields and validators, Django ensures robust data management and validation in web applications.

## 3. Django ORM

### Using ORM queries in Django Shell
To use ORM queries in the Django shell, you must first open it by running the command "python manage.py shell" in the terminal. Once it's open, import relevant models from the Django project using the "from app_name.models import ModelName" syntax. Then, use the models to perform ORM queries like creating new objects with the ".create()" method, retrieving objects with the ".get()" or ".filter()" methods, or updating objects with the ".save()" method.

The Django shell is a useful tool for developers to test and refine their database interactions in a controlled environment.

### Turning ORM to SQL in Django Shell
To view the SQL query that will be executed for a Django ORM query in the shell, you can access the "query" attribute of the query. For example, if you have a QuerySet called "products", you can print the corresponding SQL query by calling "print(products.query)". This allows you to see the actual SQL code that will be sent to the database, which can be helpful for debugging or optimization purposes.


### What are Aggregations?
Aggregations in Django are a collection of functions that allow for calculations to be performed on a QuerySet to obtain aggregated or summarized results. To use aggregations, the .aggregate() method is used to group related items and perform calculations on them, such as counting or averaging.

### What are Annotations?
Annotations in Django refer to the mechanism of adding computed fields to a QuerySet. It involves using aggregate functions like Sum, Count, Avg, etc., to calculate results based on related fields and adding them as new fields in the QuerySet. This provides a way to include dynamic or computed fields that can be used for filtering or sorting the QuerySet without modifying the database schema. Annotations can be added to a QuerySet using the .annotate() method and one or more annotation expressions.

### What is a migration file? Why is it needed?
A migration file is a Python script that contains instructions for modifying the database schema whenever you make changes to your models, such as adding or removing fields. The purpose of migration files is to version control changes to the database schema and ensure consistency among developers working on the project. Migration files also enable updating the database schema without data loss by applying the changes defined in the migration files when migrations are run. In summary, migration files are a crucial component of Django's database migration system, facilitating the management of database schema changes in a controlled and reproducible manner.

###  What are SQL transactions?
SQL transactions are a way to group multiple SQL statements into a single, atomic unit of work that can either be completed in its entirety or rolled back if an error occurs.

### What are atomic transactions?
Atomic transactions refer to a database management concept where a transaction is treated as an indivisible unit of work. It guarantees that either all the actions in the transaction will be successfully completed, or none of them will be applied to the database. The purpose of atomicity is to ensure the consistency of the database, even if there are errors or interruptions during the transaction.