初面网初面网

Django

安装

pip install django

验证是否安装成功

cmd控制台,python进入交互模式,输入下面这两行

import django django.version

生成项目

方法一:

django-admin[.py] startproject my_project

方阔号里的可写可不写。my_project是项目名称,可改成自己的项目名

方法二:

pycharm创建

指定IP及端口号

方法一:

python manage.py runserver 0.0.0.0

方法二:

pycharm中设置启动器

创建模块

方法一:

python manage.py startapp hello

hello是模块名

方法二:

pycharm创建

返回视图

在创建的hello模块中找到views.py这个文件,创建响应函数

from django.http import HttpResponse
def hello_world(request):
    return HttpResponse("hello")

然后在项目主目录中找到urls.py,添加路径。此时的代码应如下所示:

from django.contrib import admin
from django.urls import path
# 引入视图
from hello.views import hello_world

urlpatterns = [
    path('admin/', admin.site.urls),
    # 添加下面这行
    path('hello/', hello_world),
]

当我们访问hello地址时就会看到页面中的返回值

其中,path可以有三个参数:url值,返回的视图函数,匹配规则的名称。所以可有:

path('hello/<int>', hello_world, name='helloworld')

目录查找顺序

查找模板文件,会先从项目的主目录下的templates里查找(这需要settings.py里的TEMPLATES配置),然后从INSTALLED_APPS里依次查找(即从app模板目录列表中查找)

分模块管理路由

前面我们将path写入主项目里的urls.py文件中。但是当项目变大,路由变多,这样就不便于管理。我们希望能够每个模块维护自己的路由。

首先,在我们创建的hello模块中新建urls.py文件,里面的内容如下所示:

from django.urls import path

from hello.views import hello_world, hello_news

urlpatterns = [
    path('world/', hello_world),
    path('news/', hello_news),
]

可以看到我们在这里引入了两个视图函数,也就是views.py里有两个函数。views.py里的代码如下:

from django.http import HttpResponse

def hello_world(request):
    return HttpResponse("world")

def hello_news(request):
    return HttpResponse("news")

然后我们需要在主urls.py中引入这个路由

from django.contrib import admin
# 注意下面这行里的include
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    # 用include将urls引入
    path('hello/', include('hello.urls')),
]

反向寻找地址

一般我们输入网址获取视图,但也可以在视图函数中通过解析规则的名称,反向获取到地址。我们在views.py中写入:

from django.http import HttpResponse
# 引入
from django.urls import reverse

# Create your views here.

def hello_world(request):
    # 使用reverse
    print(reverse('hello_world'))
    return HttpResponse("world")

在模块的urls.py中我们要为路由解析规则命名

# 其他内容省略
path('world/', hello_world, name='hello_world'),

这样,当我们访问hello/world/这个地址的时候就能够在控制台获取到地址

动态地址

如果想访问动态地址,我们需要在视图中传入第二个参数

def hello_news(request, id):
    return HttpResponse("news", id)

同时,访问规则里也要写好匹配规则

# 其他内容省略
# 注意下面int后面的id是与视图中的参数名对应的
# 写了参数,则必须有参数,否则找不到页面
path('news/<int:id>', hello_news, name='hello_news'),

正则方式匹配规则

# 引入
from django.urls import re_path
re_path(r'^news/[<id>/]')

地址参数

地址参数,即平时地址?后面的那些值。可以用视图中的request获取。

def search(request):
  name = request.GET.get('name', None)

解决跨域

  1. 安装第三方扩展

pip install django-cors-headers

  1. 配置

在settings.py中

INSTALLED_APPS = ['corsheaders',]
  1. 配置中间件
MIDDLEWARE=[
  'django.contrib.sessions.middleware.SessionMiddleware',
  # 在这里新增中间件
  'corsheaders.middleware.CorsMiddleware',
  'django.middleware.common.CommonMiddleware',
]
  1. 添加白名单
CORS_ORIGIN_WHITELIST = (
  # 地址根据实际情况来填写即可
  'http://127.0.0.1:8080',
  'http://localhost:8080',
)
  1. 可选配置
# 允许的请求头
CORS_ALLOW_HEADERS = ('source', 'icode')

# 允许携带cookie
CORS_ALLOW_CREDENTIALS = True

request里的API

我们在前面写了很多次request参数。实际应用中,我们能够使用request下的方法获取请求信息等内容。

request.method 请求方式 request.META 请求头信息

这个META里包含很多内容,以json格式返回。其中,REMOTE_ADDR可以获取到IP地址,HTTP_USER_AGENT可以获取设备信息。还有其他信息不一一列举。

request.headers 精简的请求头信息

响应对象

在前面我们有写过如下代码:

def hello_news(request, id):
    return HttpResponse("news", id)

其中的HttpResponse就是一个响应对象。其实还有其他的。

  • HttpResponseRedirect 重定向
  • JsonResponse 响应Json
  • FileResponse 响应文件

响应对象的关系如下:

JsonResponse的父级是HttpResponse

FileResponse的父级是StreamingHttpResponse

HttpResponse和StreamingHttpResponse的共同父级是HttpResponseBase

HttpResponse

  • status 设置HTTP响应状态码
  • status_code 查看HTTP响应状态码
  • content_type 设置响应的类型
  • write() 写入响应内容
def req(request):
    # 会把响应状态码改为201
    return HttpResponse("news", status=201)

如果单独赋值成一个变量,也可以通过变量去修改状态码

def req(request):
    resp = HttpResponse("news", status=201)
    # 会把状态码改成204
    resp.status_code = 204
    return resp

上面提到了响应类型。常见的响应类型有:

  • text/html 超文本标记语言文本(HTML)
  • text/plain 普通文本
  • text/xml XML文档
  • image/png、image/jpeg、image/git 图片或图形
  • application/json json数据类型

JsonResponse

返回json格式的响应

from django.http import JsonResponse

def req(request):
    response = JsonResponse({
        'username': 'admin',
        'passwd': '123456',
    })
    return response

FileResponse

from django.http import FileResponse

# 省略函数定义及返回
response = FileResponse(open('file.txt', 'rb'))

重定向

两种方式:

  • HttpResponseRedirect
  • redirect()快捷方式

在urls.py中配置好匹配规则

from django.urls import path

from hello.views import test, page404

urlpatterns = [
    path('test/<int:id>', test, name='test'),
    path('404/', page404, name='notfound')
]

在views.py视图文件中写好响应函数

from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.urls import  reverse
def test(request, id):
    if id < 1000:
        return redirect(reverse('notfound'))
    return render(request, 'test.html')

def page404(request):
    return HttpResponse("404")

代码的意思是:访问test/id,当id这个地方的数值小于1000的时候重定向到404页面

重写内置错误视图

django内置了一些错误反馈页面。如果我们想使用自制的页面替换,需要在urls.py中配置

  • handler500 = "myproj.views.page_500"

类似的,可以有404等其他错误相关的配置。

切记,要切换到生产模式。即在settings.py中将DEBUG改为False

另外,如果要处理404页面,需要额外传request和exception参数

在项目的urls.py中新建变量

# 注意下面的myproj,应以项目名称填入
handler500 = 'myproj.views.page_500'

在项目目录中新建views.py,里面写入视图函数

def page_500(request):
    # 实际项目中应返回自制页面
    return HttpResponse("500")

处理静态文件

static.serve

在项目的settings.py中添加配置

MEDIA_URL = '/media/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'medias')

这里的media路径请根据实际情况填写。

settings里配置完毕,在urls.py中也要添加配置

from django.views.static import serve
from django.urls import re_path

urlpatterns += [
    re_path(r'^media/(?P<path>.*)$', serve,{
        'document_root': settings.MEDIA_ROOT,
    }),
]

内置通用视图

为了简化开发流程,django内置了一些视图处理。以TemplateView为例

  • 继承视图(django.views.generic.TemplateView)
  • 配置模板地址
  • 配置URL

我们在views.py中写上:

from django.views.generic import TemplateView

class HomeView(TemplateView):
    template_name = 'home.html'

在urls.py中(任意,注意访问路径)写入:

# 记得导入HomeView
# 其他省略。注意下面的函数引用
path('home/', HomeView.as_view(), name='home'),

还有其他的内置通用视图,如:

  • django.views.generic.ListView 列表类数据的封装,支持分页
  • django.views.generic.DetailView 详情类数据的封装

更新于 2026/6/7