Django开发:基本入门指南

文章目录

一、Django 框架概述

Django 是一个基于 Python 的高性能开源 Web 框架,遵循 MTV(Model-Template-View) 设计模式(类似 MVC)。它以"快速开发"和"干净设计"为核心理念,内置大量工具和功能,适合构建从简单博客到复杂企业级应用的各类项目
文档:https://docs.djangoproject.com/en/4.2/

核心特点

全栈框架 :提供 ORM、模板引擎、路由、认证等一站式解决方案。
高安全性 :默认防范 SQL 注入、XSS、CSRF 等常见漏洞。
可扩展性 :支持插件化设计,可通过第三方库扩展功能(如 REST framework)。
自动化工具:内置 Admin 后台、数据库迁移工具,减少重复代码。

主要组件

模型(Model) :通过 Python 类定义数据库结构,ORM 自动生成 SQL。
视图(View) :处理业务逻辑,返回 HTTP 响应或渲染模板。
模板(Template) :HTML 与 Django 模板语言结合,动态生成页面。
路由(URLconf):将 URL 映射到对应的视图函数。

二、 Django项目搭建与使用

包的安装

Django库的安装:pip install django

项目的创建与启动

创建项目:django-admin startproject projectname

运行项目:python manage.py runserver [127.0.0.1:8001](中括号内可指定)

访问项目:127.0.0.1:8001(浏览器中访问)
注:运行项目时,如果指定IP(python manage.py runserver 192.168.0.107),并用指定IP访问时,出于安全机制可能会无法访问,此时需要编辑 setting.py 文件,即允许该使用该IP访问

python 复制代码
# 允许以哪些主机访问后端,默认127.0.0.1
ALLOWED_HOSTS = ['192.168.0.107', '127.0.0.1']

子应用的创建与关联

创建子应用:python manager.py startapp login

主应用关联子应用:修改主应用的setting.py代码

python 复制代码
INSTALLED_APPS = [
    # 法一:子应用名
    # 'login',
    # 法二:子应用名.apps.子应用名Config
    'login.apps.LoginConnfig'
]

子应用各文件功能 (后面详细介绍各个模块功能)

view.py:视图相关

tests.py:测试相关

models.py:模型相关

migrations:迁移相关

admin.py:后台相关

apps.py:当前子应用相关
编辑子应用的 views.py 文件,用于返回内容

python 复制代码
from django.shortcuts import render
from django.http import HttpResponse


def index(request):
    return HttpResponse('index')  # 这里可以直接返回html文件

接着再创建编辑 urls.py 文件,用于访问时,调用到对于的视图函数

python 复制代码
from django.urls import path
from login.views import index


urlpatterns = [
    path('index/', index),  # 前者正则  后者视图函数(view.py中的函数)
]

编辑主应用的 urls.py ,添加引入子应用路由

python 复制代码
from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('login.urls'))  # 引入子应用路由(比如该子应用为 login)
]

项目启动

项目启动:python manage.py runserver

浏览器访问:http://127.0.0.1:8000/admin

setting.py配置

python 复制代码
# 上线时为False,调试时为True(浏览页面发生错误,会告诉你那里错了)
DEBUG = True

# 语言  英文:en-us   中文:zh-Hans
LANGUAGE_CODE = 'zh-Hans'
# 时区  UTC   Asia/Shanghai
TIME_ZONE = 'Asia/Shanghai'

三、静态文件

Diango中提供了一种解析的方式配置静态文件路径(html、图片等),静态文件可以放在项目根目录下,也可以放在应用的目录下,由于有些静态文件在项目中是通用的,所以推荐放在项目的根目录下,方便管理。

静态文件配置

配置 settings.py 文件

python 复制代码
# Django通过STATIC_UR区分静态资源和动态资源
# 定义模板中引用静态文件时的URL前缀
STATIC_URL = 'static/'
# 指定项目级别的静态文件目录,BASE_DIR变量在该文件上面有定义
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

如果静态文件目录存在图片,运行时访问http://127.0.0.1:8000/static/1.jpeg就会出现static中的图片

HTML中引用静态文件

加载static模板标签 :在html文件顶部加载static模板标签
引用静态文件的路径 :使用{% static %}模板标签生成完整路径

html 复制代码
{% load static %}
<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="{% static 'myapp/css/style.css' %}">
</head>
<body>
    <script src="{% static 'myapp/js/script.js' %}"></script>
</body>
</html>

四、中间件(类似装饰器)

Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理对程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。
中间件的定义:定义一个中间件工厂函数,然后返回一个可以被调用的中间件。中间件工厂函数需要接收一个可以调用的get_response对象。返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。
我们可以使用中间件,在Diango处理视图的不同阶段对输入或输出进行干预。setting.py 中的 MIDDLEWARE 是中间件信息
建立中间件文件 middleware/middleware.py (类似装饰器)

python 复制代码
def simple_middleware(get_response):
    def middleware(request):
        print('before request')
        # 响应前
        response = get_response(request)
        # 响应后
        print('after request')
        return response
    return middleware

在setting.py 中的 MIDDLEWARE 中加入如下内容

python 复制代码
# 中间件
MIDDLEWARE = [
    # ...
    'ProjectName.middleware.simple_middleware',   # 添加这行
]

让后访问触发view函数,终端就会打印before requestafter request
实例:可以用中间件来判断每次请求是否携带了cookie中的某些信息,通常如果不使用中间件,需要在每个函数中都添加判断的代码
不使用中间件写法如下(每个函数都要加cookie判断)

python 复制代码
from django.views import View
from django.contrib.auth.mixins import LoginRequiredMixin

class CenterView(LoginRequiredMixin, View):
    def get(self, request):
        username = request.COOKIES.get('username')
        if username is None:    # 添加判断
            print('username is None')
            return HttpResponse('没有登入')
        return HttpResponse('个人中心展示')

    def post(self, request):
        username = request.COOKIES.get('username')
        if username is None:    # 添加判断
            print('username is None')
            return HttpResponse('没有登入')
        return HttpResponse('个人中心信息修改')

中间件写法:可以利用中间件,在中间件中加入cookies检测,views视图中就可以不用使用检测

python 复制代码
def simple_middleware(get_response):
    def middleware(request):
        # 添加判断
        username = request.COOKIES.get('username')
        if username is None:
            print('username is None')
            return HttpResponse('没有登入')
        response = get_response(request)
        return response
    return middleware
python 复制代码
from django.views import View
from django.contrib.auth.mixins import LoginRequiredMixin

class CenterView(LoginRequiredMixin, View):
    def get(self, request):
        return HttpResponse('个人中心展示')

    def post(self, request):
        return HttpResponse('个人中心信息修改')

多个中间件顺序:请求前的执行顺序是按照注册的顺序从上往下(settings.py中),响应后的顺序是从下往上(注册的反顺序)

五、CSRF(跨站请求伪造)

5.1 CSRF基本概念

CSRF 指攻击者盗用了你的身份,以你的名义发送恶意请求。包括:以你名义发送邮件,发消息盗取你的账号,甚至于购买商品,虚拟货币转账...

造成的问题 :个人隐私泄露以及财产安全。


生成随机码

csrf_token放入cookie是同源策略的原因,黑客(钓鱼)网站是用于获取不到我们当前网站的cookie信息的

python 复制代码
    def get(self, request):
        from django.middleware.csrf import get_token
        # 生成随机码
        csrf_token = get_token(request)
        response = render(request, 'index.html', context={'csrf_token': csrf_token})
        # 将验证码保存至cookie中
        response.set_cookie('csrftoken', csrf_token)
        return response

获取用户输入的随机码并验证

python 复制代码
    def index(self, request):
        # 获取用户数据
        user_token = request.POST.get('csrftoken')
        to_account = request.POST.get('to_account')
        # 获取系统生成的验证码
        server_token = request.COOKIES.get('csrf_token')
        # 输入的验证码和系统生成的验证
        if user_token != server_token:
            return HttpResponse('输入错误')

上面获取数据是通过name属性获取的

html 复制代码
<body>
	<input type="hidden" name="csrftoken">
	<input type="text" name="to_account">
	<input type="number" name="money">
</body>

:是协议、域名、端口号组成
同源策略:同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。

5.2 session保存至redis中

session数据的保存、获取、删除(views.py

python 复制代码
# 增加数据
class SetSession(View):
    def get(self, request):
        request.session['name'] = 'Tony'
        return HttpResponse('abc')

# 获取数据
class GetSession(View):
    def get(self, request):
        name = request.session['name']
        return HttpResponse('abc')

# 删除数据
class DelSession(View):
    def get(self, request):
        # 删除一条数据
        del request.session['name']
        # 删除session所有数据
        # request.session.clear()
        # 把数据库/redis中的key都删除了
        # request.session.flush()
        return HttpResponse('abc')

# session时间,到了时间自动删除
class DelSession(View):
    def get(self, request):
        # 设置session时间,默认两周
        request.session.set_expiry(10)
        return HttpResponse('abc')

session数据存储位置

在settings.py中,可以设置session数据的存储方式,可以保存在数据库、本地缓存等

保存数据库中

这是默认方式,可以不配置,当然也可以按如下配置

python 复制代码
SESSION_ENGINE = 'django.contrib.sessions.backends.d'
INSTALLED_APPS = [
    # ...
    'django.contrib.sessions',
]

本地缓存

存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快

python 复制代码
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

混合缓存

优先从本机内存中存取,如果没有则从数据库中存取

python 复制代码
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'

Redis存储

在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决。

django-redis链接:https://django-redis-chs.readthedocs.io/zh_CN/latest/

安装扩展:pip install django-redis

配置settings.py内容如下

python 复制代码
# caches缓存
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

5.3 CSRF的django使用

login.html

html 复制代码
<body>

<from action="" method="post">
    <input type="text" name="money">
    <input type="submit" value="提交">
</from>
</body>

urls.py

python 复制代码
from book.views import LoginView

urlpatterns = [
    path('login/', LoginView.as_view()),
]

views.py

python 复制代码
class LoginView(View):
    def get(self, request):
        return render(request, 'login.html')

    def post(self, request):
        return HttpResponse('post')

在上面的基础上,浏览链接输入内容后点击提交会报错,需要在login.html中加入如下代码

html 复制代码
<body>

<from action="" method="post">
    {% csrf_token %}
    <input type="text" name="money">
    <input type="submit" value="提交">
</from>
</body>

然后点击提交,会跳转到post请求中去

相关推荐
Sinsa_SI15 小时前
2026算法应用主题赛初赛-小学4-6组(Python)试卷(含答案+详细解析)
开发语言·python·算法
繁星星繁15 小时前
Python语法(三)
开发语言·python
松☆15 小时前
10分钟上手pypto:用Python直接调PTO虚拟指令集
开发语言·python
晚烛15 小时前
CANN 大模型推理优化实战:FlashAttention、推测解码与连续批处理的工程实现
开发语言·人工智能·python·深度学习·数据挖掘
*愿风载尘*16 小时前
Python多重继承MRO报错问题处理
开发语言·python
子午16 小时前
基于YOLO的PCB电路板缺陷检测系统~Python+目标检测+深度学习+YOLOV8算法+模型训练+人工智能
人工智能·python·yolo
码界筑梦坊16 小时前
144-基于Flask的电商超市数据可视化分析系统
开发语言·python·信息可视化·数据分析·flask
彦为君16 小时前
Spring定时任务开发指南(动态实现)
java·开发语言·后端·python·spring·wpf
是三旬老汉。16 小时前
从传感器到推理端:VLA 机器人 TCP 通信与 msgpack 序列化深度解析
python·网络协议·tcp/ip·机器人