Python全栈:初识Django框架

本文详细介绍Django框架的基础知识,包括安装配置、项目结构、开发流程等,并深入讲解视图处理、请求响应机制及类视图的应用。
部署运行你感兴趣的模型镜像

1 Django介绍

Django是什么?

开源免费的 Python高级Web框架,内置电池,用于快速开发可靠、安全、可扩展的web应用。

获取帮助:

Django documentation | Django documentation | Django (djangoproject.com)

使用 Django框架的开发步骤:

  • 步骤一:选择合适的版本
  • 步骤二:安装及配置
  • 步骤三:生成项目结构
  • 步骤四:内容开发
  • 步骤五:迭代、上线、维护

版本兼容情况:

image-20210203090837473

版本支持情况:

image-20210203090857163

2 Django开发基础知识

2.1 Django的安装

  • 方式一:pip安装[推荐]

    pip install django

  • 方式二:源码安装

    python setup.py install

    地址:Django · PyPI

image-20210203094047220

  • 检测是否安装成功
import django

django.__version__

image-20210203092809729

2.2 Django项目的创建

  • 方式一:使用命令行生成模板
django-admin[.py] startproject my_project

image-20210203093148011

image-20210203093158855

  • 方式二:使用 pyCharm创建项目

image-20210203093435837

image-20210203093408264

image-20210203093529789

2.3 Djang项目结构

image-20210203093717956

2.4 启动开发服务器

  • 启动服务器(方式一)
python manage.py runserver

image-20210203094204245

  • 启动服务器(方式二)

image-20210203094539375

image-20210203094729422

启动成功:

image-20210203094239342

3 Django开发流程讲解

3.1 项目导入

  • 使用 django-admin创建的项目导入配置

image-20210203095430854

配置:

image-20210203095532338

配置界面:

image-20210203095547212

3.2 reserver常用参数

  • 指定端口
python manage.py runserver 9527

image-20210203100518928

image-20210203100539139

  • 配置IP及端口
python manage.py runserver 0.0.0.0:9527

提示:需要在 settings.py配置 ALLOWED_HOSTS

image-20210203100859786

image-20210203100944624

3.3 创建模块

  • 创建hello模块
python manage.py startapp hello

image-20210203101441945

image-20210203101502266

3.4 完成第一个页面

  • 第一步:在views.py文件写个函数

image-20210203101707537

  • 第二步:在urls.py配置规则

image-20210203101805846

  • 重启服务器,访问:http://localhost:9527/hello/

image-20210203101845269

4 Django从请求到响应

什么是视图?

  • 一个视图函数,简称视图,是一个简单的 Python函数

    def view_name()定义视图函数

  • 接受一个请求,返回一个响应

URL的设计:

  • 设计简单优雅的URL
    • 使用正则表达式
    • 指定参数类型
urlpatterns = [
    path('admin/', admin.site.urls),
    # 固定的类型
    # /hello
    # 指定参数类型
    # /article/<int>
    # /article/5001
    # /article/5002
    # 使用正则表达式
    path('hello/',hello_world)
]

URL的常用配置:

  • path(route, view, name, **kwargs)函数
    • route:URL匹配规则
    • view:视图函数
    • name:路由的名称
    • **kwargs:其它参数
  • include (urls, namespace)函数
    • urls:URL匹配规则列表
    • namespace:命名空间

模块化管理

image-20210203103759230

image-20210203103844983

image-20210203103828733

访问:

http://localhost:9527/hello/world/

http://localhost:9527/hello/china/

image-20210203103907681

image-20210203103929509

URL与视图的关系

  • URL的正向解析

image-20210203104023120

  • URL的逆向解析

image-20210203104100107

image-20210203104415593

image-20210203104435951

视图响应的内容

响应可以是:

  • 文本
  • HTML内容
  • 图像
  • 甚至是404、重定向等

5 Django在视图中处理业务逻辑

5.1 响应HTML内容

  • def view_name()定义视图
from django.http import HttpResponse

def hello_html(request):
    """ 响应HTML内容 """
    html = """
    <html>
        <body>
            <h1 style="color:#f00">hello html</h1>
        </body>
    </html>
    """
    return HttpResponse(html)

image-20210203105154756

image-20210203105206905

image-20210203105128355

5.2 获取URL参数

  • 获取URL中的指定类型的参数

    URL规则:

    path('article/<int:month>/')
    views.article,name='article_list'
    

    输入URL:

    http://127.0.0.1:8000/article/05/
    

    视图编写:

    def article(request, month):
        return HttpResponse('article:' + month)
    

    image-20210203105852370

    image-20210203105823405

image-20210203105810278

  • 获取URL中的正则匹配的参数

    URL正则:

    re_path(r'^article/(?P<month>0?[1-9]|1[012])/$',views.article, name='article_list')
    

    输入URL:

    http://127.0.0.1:8000/article/05/
    

    视图编写:

    def article(request, month):
        return HttpResponse('article:' + month)
    

image-20210203110622926

1-12月正常访问:

image-20210203110409912

不符合则报错误:

image-20210203110433508

5.3 获取GET/POST参数

  • 获取请求中(GET/POST等)参数

    输入URL:

    http://127.0.0.1:8000/search/?name=五月天
    

    视图编写:

    def search(request):
        """ GET参数的获取 """
        name = request.GET.get('name', '')
        print(name)
        return HttpResponse('查询成功')
    

image-20210203112046549

image-20210203112059874

image-20210203112135073

image-20210203112115614

6 Django从文件响应HTML内容

原理解析:

  • 第一步,从磁盘读取HTML文件
  • 第二步,替换HTML中的特殊字符
  • 第三步,发送给浏览器

render_to_string()函数

render_to_string(
	template_name,	# 模板名称
    context=None,	# 请求对象
    request=None,	# 模板上下文对象(dict)
    using=None		# 模板引擎名称(如:Jinjia2)
)
  • 新建模板文件夹

image-20210203120219634

  • 新建index.html文件

image-20210203120341617

  • 编写视图函数

image-20210203120657454

  • 配置url

image-20210203120727943

  • 配置模板地址

image-20210203120843883

  • 运行
http://127.0.0.1:9527/hello/render/str/

image-20210203120914122

render()函数

render(
	request,			#请求对象
    template_name,		#模板名称
    context=None,		#模板上下文对象(dict)
    content_type=None,	#MIME类型,默认为text/html
    status=None,		#HTTP状态码
    using=None			#模板引擎名称(如:Jinjia2)
)
  • 编写视图函数

image-20210203121427818

  • 配置urls

image-20210203121500841

  • 查看效果
http://127.0.0.1:9527/hello/render/html/

image-20210203121521252

修改模板地址

image-20210203121827299

  • 在模块下建立文件夹

image-20210203122439255

  • 配置

image-20210203122542558

  • 修改视图函数

image-20210203122757893

  • 访问

image-20210203122818085

  • 原理解析:

image-20210203122904255

7 Django请求响应对象

image-20210203123137640

请求对象 HttpRequest

  • 请求方式method(POST/GET/…)
  • 请求头信息META/headers
    • REMOTE_ADDR——请求的IP地址
    • HTTP_USER_AGENT——用户请求终端信息
  • 获取请求传递参数
    • GET——GET请求参数
    • POST——POST请求参数
    • COOKIES——cookie信息
    • FILES——文件信息
def http_request(request):
    """ 请求练习 """
    # 1. 请求方式
    print(request.method)
    return HttpResponse('响应')

image-20210203123812831

  • 修改视图函数
def http_request(request):
    """ 请求练习 """
    # 1. 请求方式
    print(request.method)

    # 2. 请求头信息
    headers = request.META
    print(headers)

    ua = request.META.get('HTTP_USER_AGENT', None)
    print(ua)

    print(request.headers)
    print(request.headers['User-Agent'])

    # 3. 获取请求参数
    name = request.GET.get('name', '')
    print('name:',name)

    return HttpResponse('响应')
  • 访问:

image-20210203124442829

  • 控制台打印信息

image-20210203124528885

响应对象

  • HttpResponse
  • HttpResponseRedirect——重定向
  • JsonResponse——响应json
  • FileResponse——响应文件

响应对象之间的关系

image-20210203124717423

image-20210203124753798

HttpResponse

  • status设置HTTP响应状态码

  • status_code查看HTTP响应状态码

  • content_type设置响应的类型

  • write()写入响应内容

def http_response(request):
    """ 响应练习 """
    resp = HttpResponse('响应内容', status=201)
    resp.status_code = 204
    print(resp.status_code)
    return resp

JsonResponse

  • 示例代码
from django.http import JsonResponse

response = JsonResponse({
    'username':'admin',
    'passwd':'123456',
    'sex':'男'
})

FileResponse

  • 示例代码
from django.http import FileResponse

response = FileResponse(open('myfile.png','rb'))

常见的 Content-Type

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

8 Django视图快捷方法

什么是重定向?

image-20210203142413672

实现URL访问的重定向:

  • 使用 HttpResponseRedirect 重定向
  • 使用redirect()快捷方式

使用 HttpResponseRedirect 重定向

def no_data_404(request):
    """ 404 页面"""
    return HttpResponse('404')

def article_detail(request, article_id):
    """
    文章详情,ID是从1000开始的整数
    :param article_id 文章ID
    """

    if article_id < 1000:
        return HttpResponseRedirect(reverse('no_data_404'))

    return HttpResponse('文章{}的内容'.format(article_id))

image-20210203143938361

  • 效果

image-20210203144010882

访问:http://localhost:9527/hello/article/99/

会自动重定向

image-20210203144228801

使用redirect()快捷方式

def article_detail(request, article_id):
    """
    文章详情,ID是从1000开始的整数
    :param article_id 文章ID
    """

    if article_id < 1000:
        # return HttpResponseRedirect(reverse('no_data_404'))
        
        # return redirect('no_data_404')
        # return redirect('/hello/404/')
        return redirect('https://www.baidu.com/')

    return HttpResponse('文章{}的内容'.format(article_id))

9 Django内置的视图及重写

内置的错误处理视图:

  • 400 Bad Request
  • 403 Forbidden
  • 404 Not Found
  • 500 Internal Server Error

重写内置的错误处理视图

  • 在项目urls.py中添加配置
  • hander500 = ‘my_project.views.page_500’
    • hander400
    • hander403
    • hander404
  • 切换到生产模式DEBUG=False

image-20210203145817127

  • 新建views文件

image-20210203150040274

  • 自定义500位置

image-20210203150121483

  • 500的时候就显示自己定义的界面了

image-20210203150202314

static.serve处理静态文件

  • 在项目setting.py中添加配置

    MEDIA_URL = '/media'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'medias')
    
  • 在项目urls.py中添加配置

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

    image-20210203151654627

    image-20210203151710458

image-20210203151642358

10 Django使用class重写视图

基于类的视图

  • 视图是一个可调用对象,可以接收一个请求然后返回一个响应
  • 基于类的视图可以结构化你的视图
  • 基于类的视图可以利用继承和混合重用代码
  • 内置的视图拿来即用,代码更简洁

举例:TemplateView

  • 步骤一:继承视图

    django.views.generic.TemplateView
    
    from django.views.generic import TemplateView
    
    class HomeView(TemplateView):
        template_name = 'home.html'
    
  • 步骤二:配置模板地址

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
    </head>
    <body>
      <h1>home</h1>
    </body>
    </html>
    
  • 步骤三:配置URL

    from hello.views import HomeView
    
    path('home/', HomeView.as_view(), name='home')
    

    image-20210203152817536

TemplateView原理解析

  • 从项目主目录寻找模板文件
  • 从app的模板目录寻找模板文件

内置通用视图

  • django.views.generic.ListView

    列表类数据的封装,如:景点列表支持分页

  • django.views.generic.DetailView

    详情类数据的封装,如:景点详情

看清类视图的本质

  • class ListView(MutipleObjectTemplateResponseMixin, BaseListView)

    image-20210203153052042

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级D洋葱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值