Django 入门详解(一)


参考视频:https://ke.qq.com/course/320021

一、概念

Django是Python的一个主流Web框架,提供一站式解决方案,开发成本低,内建ORM、数据管理后台、登录认证、表单、RESTAPI等功能,适合开发中大型项目。

其他Web框架:
• Flask(轻量级)
• Tornado(异步)

二、开发环境准备

在这里插入图片描述
Pycharm下载地址:https://www.jetbrains.com/pycharm/download/#section=windows

Pycharm永久激活:https://docs.qq.com/doc/DVVdTa3BzYVhyV2RL(最新版本不行,我用的2019.3.5)

三、创建项目

3.1.通过pycharm创建

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行项目
在这里插入图片描述
启动成功,访问该地址
在这里插入图片描述
项目创建完成
在这里插入图片描述

3.2.通过命令行创建

1、创建项目
django-admin startproject devops
2、创建应用
python manage.py startapp myapp
3、运行项目
python manage.py runserver 0.0.0.0:8888

四、制作首页

4.1.创建应用

在这里插入图片描述

4.2.添加URL路由

devops/urls.py

from django.contrib import admin
from django.urls import path
from myapp import views

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('index',views.index),     # 访问网站路径/index时路由到views视图下的index函数,类似于Nginx的重定向
]

4.3.添加视图

myapp/views.py

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def index(request):
    return HttpResponse('Hello World!')

4.4.重启项目,访问http://127.0.0.1:8000/index

在这里插入图片描述

4.5.访问流程

在这里插入图片描述

五、读取日志文件

5.1.在myapp下创建日志文件access.log

在这里插入图片描述

5.2.代码

在devops/urls.py下添加URL路由

path('logs',views.logs),

myapp/views.py添加视图

def logs(request):
    import os.path
    current_dir = os.path.dirname(os.path.abspath(__file__))    # 获取当前脚本所在的目录路径
    with open(current_dir + '\\access.log') as f:
        result = f.read()
    return render(request, "logs.html", {"result": result})     # 调用logs.html文件,并把result传递过去

5.3.在templates下创建logs.html

在这里插入图片描述
logs.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>日志</title>
</head>
<body>
    <h1>Nginx访问日志</h1>
    <h3>
        <pre style="color: red">{{ result }}</pre>
    </h3>
</body>
</html>

5.4.访问结果

在这里插入图片描述

六、Django工作流程

在这里插入图片描述

七、Django URL路由系统

7.1.URL路由系统是什么

路由系统是URL路径和视图函数的一个对应关系,也可以称为转发器

7.2.URL配置

URL路由系统格式:
devops/urls.py

urlpatterns = [
	path(regex, view, kwargs=None, name=None)
]

• urlpatterns:一个列表,每一个path()函数是一个元素,对应一个视图。

• regex:一个字符串或者正则表达式,匹配URL。 • view:对应一个函数视图或者类视图(as_view()的结果),必须返回一个HttpResponse对象,Django将这个对象转换成一个HTTP响应。

• kwargs:可选,字典形式数据传递给对应视图。

• name:可选,URL名称

7.3.URL路由分发

在这里插入图片描述
URL路由分发好处:urls配置解耦,方便管理

7.4.示例,访问子级URL

devops/urls.py添加

from django.urls import path,include

path('myapp/', include('myapp.urls')),

在myapp下创建urls.py
在这里插入图片描述

from django.urls import path
from myapp import views

urlpatterns = [
    path('hello', views.hello),
]

myapp/views.py下添加

def hello(request):
    return HttpResponse('Hello Django')

重启项目,访问http://127.0.0.1:8000/myapp/hello
在这里插入图片描述

7.5.URL正则表达式匹配

URL路径也可以使用正则表达式匹配,re_path()替代path()

示例:博客文章归档访问形式

http://ip:port/articles/2021		# 访问2021年的文章
http://ip:port/articles/2021/1		# 访问20211月的文章
http://ip:port/articles/2021/1/123	# 访问20211月ID为123的文章

devops/urls.py:

from django.urls import re_path
from myapp import views

urlpatterns = [
    re_path('articles/([0-9]{4})/$', views.year_archive),
    re_path('articles/([0-9]{4})/([0-9]{1,2})/$', views.month_archive),
    re_path('articles/([0-9]{4})/([0-9]{1,2})/([0-9]+)$', views.article_detail),
]

分组匹配内容会传递到函数视图位置参数

正则匹配从左到右,URL匹配从上到下,匹配到就返回

myapp/views.py:

from django.http import HttpResponse

def year_archive(request, year):
    return HttpResponse(f"查看{year}年的文章")
def month_archive(request, year, month):
    return HttpResponse(f"查看{year}年{month}月的文章")
def article_detail(request, year, month, id):
    return HttpResponse(f"查看{year}年{month}月的id为{id}的文章")

访问效果:
在这里插入图片描述

命名分组

语法:(?P<name>pattern) 其中name是名称,pattern是匹配的正则表达式

示例:

re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/$', views.month_archive),

当视图函数去使用变量时可以通过名字去调用,不需要位置上一一对应,这种方法更加灵活

def month_archive(request, month, year):
    return HttpResponse(f"查看{year}年{month}月的文章")

7.6.URL名称

在前端代码里经常会指定URL,例如超链接,提交表单等,这时用URL反查就方便多了

相当于给url起了个别名,当路由路径改变时,不需要修改前端代码

path('test',views.test,name='test'),	# 起别名为test

html指向名字为test的URL

<a href="{% url 'test' %}">测试</a>

八、Django 视图

8.1.Django内置函数

在这里插入图片描述

8.2.HTTP请求流程

在这里插入图片描述

8.3.HttpRequest对象

8.3.1.常用属性

Django会建立一个包含请求源数据的HttpRequest对象,当Django加载对应的视图时,HttpRequest对象将作为函数视图的第一个参数(request),每个视图负责返回一个HttpResponse对象。

在这里插入图片描述

def index(request):
    print(request.scheme)
    print(request.GET)
    print(request.method)
    print(request.META["HTTP_USER_AGENT"])      # 返回客户端浏览器类型
    return HttpResponse('<h1>首页</h1>')

在这里插入图片描述

8.3.2.常用方法

在这里插入图片描述

8.3.3.接收URL参数

URL参数形式:http://127.0.0.1:8000/?id=1&value=100

print(request.GET['id'])
print(request.GET['value'])

在这里插入图片描述

8.3.4.QueryDict对象

request.GET和request.POST返回的都是一个QueryDict对象,类似于字典。
在这里插入图片描述

print(request.GET.get("value", None))	# 推荐使用,即使客户端没有传入value,服务端与客户端均不报错

8.3.5.示例一:表单GET提交,例如搜索页面

urls.py:

re_path('search$', views.search),

views.py:

def search(request):
    key = request.GET.get('key')
    result = f"<h1>这是你查询{key}的返回结果......</h1>"
    return HttpResponse(result)

访问http://127.0.0.1:8000/search?key=kubernetes
在这里插入图片描述

8.3.6.示例二:表单POST提交,例如登录页面

为了方便测试,先关闭CSRF
在这里插入图片描述
urls.py:

re_path('login/$', views.login, name="login"),

views.py:

from django.shortcuts import render,redirect
from django.http import HttpResponse

def login(request):
    if request.method == "GET":
        return render(request, 'login.html')
    elif request.method == "POST":
        # 获取用户通过POST提交的用户名和密码
        username = request.POST.get("username", None)
        password = request.POST.get("password", None)

        # 登录判断
        if username == "devops" and password == "123456":
            return redirect('/')        # 跳转到首页
        else:
            msg = "用户名或密码输入错误!!!"
            return render(request, 'login.html', {"msg": msg})

login.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
    <form action="{% url 'login' %}" method="post">
        用户名:<input type="text" name="username">
        密码:<input type="text", name="password">
        <button type="submit">登录</button>
    </form>
    <span style="color: red">{{ msg }}</span>
</body>
</html>

登录错误:
在这里插入图片描述
登录成功,跳转到首页
在这里插入图片描述

8.3.7.示例三:上传文件,例如修改头像

urls.py:

re_path('user/$', views.user, name="user"),

views.py:

def login(request):
    if request.method == "GET":
        return render(request, 'login.html')
    elif request.method == "POST":
        # 获取用户通过POST提交的用户名和密码
        username = request.POST.get("username", None)
        password = request.POST.get("password", None)

        # 登录判断
        if username == "devops" and password == "123456":
            return redirect('/')        # 跳转到首页
        else:
            msg = "用户名或密码输入错误!!!"
            return render(request, 'login.html', {"msg": msg})

def user(request):
    if request.method == "GET":
        return render(request, 'user.html')
    elif request.method == "POST":
        obj = request.FILES.get('touxiang')
        file_name = obj.name
        import os
        file_path = os.path.join('upload', file_name)   # 把图片保存到upload目录下
        with open(file_path, 'wb') as f:
            for data in obj.chunks():       # django提供的chunks方法,可以提高上传速度
                f.write(data)
        msg = "图片上传成功"
        return render(request, 'user.html', {"msg": msg})

user.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户信息</title>
</head>
<body>
    <form action="{% url 'user' %}" method="post" enctype="multipart/form-data">
        <input type="file" name="touxiang">
        <button type="submit">提交头像</button>
    </form>
    <span style="color: blue">{{ msg }}</span>
</body>
</html>

在项目下创建upload目录,用于保存上传的图片
在这里插入图片描述
上传图片
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查看图片
在这里插入图片描述

8.3.8.request.GET应用场景

• 获取客户端信息、请求页面情况

• 接收客户端上传的数据,例如文件

• 根据客户端特定信息做相应的处理,例如根据请求方法

8.4.HttpResponse对象

8.4.1.HttpResponse函数

给浏览器返回数据。

语法:HTTPResponse(content=响应体,content_type=响应体数据类型,status=状态码)

示例:设置响应头

from django.http import HttpResponse

def index(request):
	res = HttpResponse('<h1>首页</h1>')
    res["name"] = "devops"
    res.status_code = 302	# 设置返回状态码
    return res

访问时按F12打谷歌浏览器的调试模式
在这里插入图片描述

8.4.2.render函数

render指定模板,返回一个渲染后的HttpResponse对象。

语法:render(request, template_name, context=None, content_type=None, status=None, using=None)

• request:固定参数,django封装的请求

• template_name:返回html模板

• context:传入模板中的内容,用于渲染模板,默认空字典

8.4.3.redirect函数

重定向,发起第二次请求

语法:redirect(to, *args, **kwargs)

参数可以是:
• 一个视图
• 一个绝对的或者相对的URL
• 一个模型,对象是重定向的URL

示例:

from django.shortcuts import redirect
def test_redirect(request):
	return redirect('https://www.baidu.com')	# 跳转到百度

8.4.4.StreamingHttpResponse函数

适合响应大文件,如视频

8.4.5.FileResponse函数

如果提供文件下载建议方法

示例:文件下载服务

urls.py:

re_path('upload/$', views.upload, name="upload"),
re_path('download/(?P<filename>.*)$', views.download, name='download'),

views.py:

from django.http import FileResponse
import os

def upload(request):
    file_list = os.listdir('upload')
    return render(request, 'upload.html', {"file_list": file_list})

def download(request, filename):
    file_path = os.path.join('upload', filename)
    res = FileResponse(open(file_path, 'rb'))      # 打开文件
    res['Content-Type'] = 'application/octet-stream'        # 添加响应头信息
    res['Content-Disposition'] = 'attachment; filename=%s' % (filename)
    return res

upload.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件列表</title>
</head>
<body>
    {% for filename in file_list %}
        <a href={% url 'download' filename %}>{{ filename }}</a><br>
    {% endfor %}
</body>
</html>

实现效果:
在这里插入图片描述

8.4.6.JsonResponse函数

响应一个JSON对象

from django.http import JsonResponse

def app(request):
    d = {"name": "devops", "password": "123456"}
    return JsonResponse(d)

在这里插入图片描述

相关推荐
学习django很好的入门书籍,详细介绍了django的mvc 模式等。是python用来做web开发的主流框架。 作为一个鼓励快速开发,并遵循MVC设计的框架,django现在十分流行。推荐学习了python的朋友都去看看django框架。 设计哲学   Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以“插件”形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(Do Not Repeat Yourself)原则。   Django基于MVC的设计十分优美:   对象关系映射 (ORM,object-relational mapping)   以Python类形式定义你的数据模型,ORM将模型与关系数据库连接起来,你将得到一个非常容易使用的数据库API,同时你也可以在Django中使用原始的SQL语句。   URL 分派   使用正则表达式匹配URL,你可以任意设计的URL,没有框架的特定限定。象你喜欢的一样灵活。   模版系统   使用Django强大而可扩展的模板语言,可以分隔设计、内容和Python代码。并且具有可继承性。   表单处理   你可以方便的生成各种表单模型,实现表单的有效性检验。可以方便的从你定义的模型实例生成相应的表单。   Cache系统   可以挂在内存缓冲或其它的框架实现超级缓冲 -- 实现你所需要的粒度。   会话(session),用户登录与权限检查   快速开发用户会话功能。   国际化   内置国际化系统,方便开发出多种语言的网站。   自动化的管理界面   不需要你花大量的工作来创建人员管理和更新内容。Django自带一个ADMIN site,类似于内容管理系统。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页