0
点赞
收藏
分享

微信扫一扫

【从零开始学习--设计模式--策略模式】

Mezereon 2023-12-18 阅读 11
djangopython

第一章 Django 基本使用
第二章 Django URL路由系统
第三章 Django 视图系统
第四章 Django 模板系统
第五章 Django 数据模型系统(基本使用)
第六章 Django 数据模型系统(多表操作)
第七章 Django 用户认证与会话技术
第八章 Django CSRF防护


文章目录


Django内建函数与HTTP请求流程

Django内建函数

HTTP请求流程

在这里插入图片描述

  • 建立TCP连接:三次握手
  • 发送HTTP请求:进行分装了浏览器信息(方法\URL\浏览器信息等)
  • 相应HTTP请求:浏览器进行解析,获取信息
  • 关闭TCP连接

Django请求流程

在这里插入图片描述

  • pc发起请求
  • django根据路由转发到不通视图,转发时候会包含浏览器信息(request)
  • 视图会httpResponse发给django
  • django响应给pc

HttpResponse常用属性和方法

常用属性

例如:

def index(request):
    return HttpResponse("首页")
属性描述
request.scheme表示请求协议的字符串(http或https)
request.body原始HTTP请求正文
request.path一个字符串,请求页面的完整路径,不包含域名
request.method一个字符串,请求的HTTP方法,比如GET/POST等
request.GETGET请求所有参数,返回QueryDict类型
request.POSTPOST请求所有参数,返回QueryDict类型
request.COOKIES以字典格式返回Cookie
request.session可读写的类似于字典的对象,表示当前的会话
request.FILES所有上传的文件
request.META所有上传的文件

路由

# devops/urls.py
from django.urls import path
from myapp import views

urlpatterns = [
    path('index/',views.index),
]

视图

# myapp/views.py
from django.shortcuts import render,HttpResponse
def index(request):
    print('scheme:',request.scheme)
    print('body',request.body)
    print('path:',request.path)
    print('method:',request.method)
    print('GET:',request.GET)
    print('POST:',request.POST)
    print('COOKIES:',request.COOKIES)
    print('session:',request.session)
    print('FILES:',request.FILES)
    # print(request.META)
    print(request.META['TERM_PROGRAM'])
    return HttpResponse("<h1>首页</h1>")

验证

在这里插入图片描述

常用方法

属性描述
request.get_host()服务器主机地址和端口
request.get_port()服务器端口
request.get_full_path()请求页面后缀
request.get_raw_uri()请求页面URL所有信息,报货主机名、路径和参数

路由

# devops/urls.py
from django.urls import path
from myapp import views

urlpatterns = [
    path('index/',views.index),
]

视图

# myapp/views.py
from django.shortcuts import render,HttpResponse
def index(request):
    print(request.get_host())
    print(request.get_port())
    print(request.get_full_path())
    # print(request.get_raw_uri())
    return HttpResponse("<h1>首页</h1>")

验证

在这里插入图片描述

处理URL参数

http://49.232.221.200:8888/index/?id=123&value=100

路由

# devops/urls.py
from django.urls import path
from myapp import views

urlpatterns = [
    path('index/',views.index),
]

视图

# myapp/views.py
from django.shortcuts import render,HttpResponse
def index(request):
    A = request.GET['id']
    B = request.GET['value']
    print(A)
    print(B)
    return HttpResponse("<h1>首页</h1>")

验证

在这里插入图片描述

HttpRequest对象:QueryDic对象

QueryDic对象介绍

def index(request):
   req = request.GET
   print(type(req))
   return HttpResponse("首页")
属性描述
req.get(key,default)返回key的值,如果key不存在返回default
req.items()返回迭代器,键值
req.values()返回迭代器,所有键的值
req.keys()返回所有键
req.getlist(key,deafult)返回key的值作为列表,如果key不存在返回default
req.lists()返回迭代器,所有键的值作为列表
req.dict()返回字典
### 路由
# devops/urls.py
from django.urls import path
from myapp import views

urlpatterns = [
    path('index/',views.index),
]

视图

def index(request):
    A = request.GET['id']
    B = request.GET['value']
    # value = request.GET.get('value',None)
    # print(value)
    req = request.GET
    for i in req.items():
        print(i)
    # print(A)
    # print(B)
    return HttpResponse("<h1>首页</h1>")

验证

http://49.232.221.200:8888/index/?id=123&value=100
在这里插入图片描述

示例1:搜索

路由

# devops/urls.py
from django.urls import path,re_path
from myapp import views

urlpatterns = [
    re_path('^search/$',views.search),
]

视图

# myapp/views.py
def search(request):
    # key = request.GET.get('key')
    key = request.GET.get('key',None)
    if key is None:
        result = "<h1>请输入想要查询的</h1>"
    else:
        result = "<h1>你是想要查询 %s 是不是</h1>" %key
    return HttpResponse(result)

验证

在这里插入图片描述
在这里插入图片描述

示例2:登录页面

先关闭django防跨站机制进行注释

devops/devops/settings.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

路由

# devops/urls.py
from django.urls import path,re_path
from myapp import views
urlpatterns = [
    re_path('login/$',views.login,name="login"),
    path('index/',views.index),
]

视图

# myapp/views.py
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
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 == "wang" and password == "123456":
            # 登录成功
            # return HttpResponse("登录成功")
            return redirect("/index")
        else:
            # 登录失败
            msg = "用户名或密码输入错误!!!"
            return render(request,"login.html",{"msg":msg})
            # return render(request,"login.html")
def index(request):
    return HttpResponse("<h1>首页</h1>")

网页

# templates/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>

验证

http://49.232.221.200:8888/login/
错误示范:
在这里插入图片描述
在这里插入图片描述
正确示范:
在这里插入图片描述
在这里插入图片描述

示例3:上传文件头像图片

mkdir -p /data/devops/upload

路由

# devops/urls.py
from django.urls import path,re_path
from myapp import views
urlpatterns = [
    re_path('user/$',views.user,name="user"),
]

视图

# myapp/views.py
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def user(request):
    if request.method == "GET":
        return render(request,'user.html')
    elif request.method == "POST":
        obj = request.FILES.get('touxiang')
        import os
        file_path = os.path.join('upload',obj.name)
        with open(file_path,mode="wb") as f:
            for i in obj.chunks():
                f.write(i)
        msg = "上传文件成功"
        return render(request,"user.html",{"msg":msg})

网页

# templates/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: red">{{ msg }}</span>
    </body>
</html>

验证

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

函数

HttpResponse函数

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

示例

返回HTML内容

from django.http import HtttpResponse
def hello(request):
    return HttpResponse("<h1>Hello Django!</h1>")

设置响应头

from django.http import HttpResponse
def hello(request):
    res = HttpResponse("Hello APP!")
    res['name'] = "aliang"
    res.status_code = 302

路由

# devops/devops/urls.py
from django.urls import path,re_path
from myapp import views
urlpatterns = [
    re_path('index/$',views.index),
]

视图

# devops/devops/views.py
from django.shortcuts import render,HttpResponse,redirect
def index(request):
    res = HttpResponse("<h1>首页</h1>")
    res['username'] = "wq"
    res.status_code = 700
    return res

验证

URL:http://49.232.221.200:8888/index/

在这里插入图片描述

render函数

语法: render(request,template_name,context=None,content_type=None,status=None,using=None)
  • request:固定参数,django封装的要求
  • template_name:返回html模板
  • context:传入模板中的内容,用于渲染模板,默认空字典

示例

from django.shortcuts import render
from datetime import datetime
def current_datetime(request):
    now = datetime.now()
    return render(request,'demo.html',{'datetime':now})

路由

# devops/devops/urls.py
from django.urls import path,re_path
from myapp import views
urlpatterns = [
    re_path('date/$',views.date),
]

视图

# devops/devops/views.py
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def date(request):
    from datetime import datetime
    now = datetime.now()
    return render(request,'date.html',{'now':now})

网页

# devops/templates/date.html
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>显示当前时间</title>
    </head>
    <body>
        {{ now }}
    </body>
</html>

验证

URL:http://49.232.221.200:8888/date/

在这里插入图片描述

redrict函数

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

参数可以是:

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

示例

from django.shortcuts import redirect
def test)redirect(request):
    return redirect('https://www.baidu.com')

路由

# devops/devops/urls.py
from django.urls import path,re_path
from myapp import views
urlpatterns = [
    re_path('date/$',views.date),
]

视图

# devops/devops/views.py
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def date(request):
    from datetime import datetime
    now = datetime.now()
    # return render(request,'date.html',{'now':now})
    # return redirect('http://www.baidu.com')
    return redirect('/index')
def index(request):
    res = HttpResponse("<h1>首页</h1>")
    res['username'] = "wq"
    res.status_code = 700
    return res

验证

访问:http://49.232.221.200:8888/date
会跳到:http://49.232.221.200:8888/index/

流处理函数,实现图片下载

StreamingHttpResponse函数

路由

# devops/urls.py
from django.urls import path,re_path
from myapp import views

urlpatterns = [
    re_path('upload_list/$',views.upload_list),
    re_path('download/(?P<filename>.*)$',views.download,name="download")
]

视图

# myapp/views.py
from django.shortcuts import render,HttpResponse,redirect
import os
from django.http import StreamingHttpResponse
# Create your views here.
def upload_list(request):
    file_list=os.listdir('upload')
    return render(request,"upload_list.html",{'file_list':file_list})

def download(request,filename):
    file_path=os.path.join('upload',filename) # 使用os拼接可以有效的防止windwos反斜杠路径
    res=StreamingHttpResponse(open(file_path,'rb'))
    # 因为没有定义头部信息,浏览器读取出来是乱码,所以定义下
    # 传输流
    res['Content-Type']='application/octet-stream'
    # 加描述
    res['Content-Disposition']='attachment: filename=%s' %(os.path.basename(file_path))
    return res

网页

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

验证

在这里插入图片描述

FileResponse函数

路由

# devops/urls.py
from django.urls import path,re_path
from myapp import views

urlpatterns = [
    re_path('upload_list/$',views.upload_list),
    re_path('download/(?P<filename>.*)$',views.download,name="download")
]

视图

# myapp/views.py
from django.shortcuts import render,HttpResponse,redirect
import os
from django.http import StreamingHttpResponse,FileResponse
# Create your views here.
def upload_list(request):
    file_list=os.listdir('upload')
    return render(request,"upload_list.html",{'file_list':file_list})

def download(request,filename):
    file_path=os.path.join('upload',filename) # 使用os拼接可以有效的防止windwos反斜杠路径
    res=FileResponse(open(file_path,'rb'))
    # 因为没有定义头部信息,浏览器读取出来是乱码,所以定义下
    # 传输流
    res['Content-Type']='application/octet-stream'
    # 加描述
    res['Content-Disposition']='attachment: filename=%s' %(os.path.basename(file_path))
    return res

网页

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

验证

在这里插入图片描述

JsonResponse函数

示例

from django.http import JsonResponse
def test_response(request):
    res={ 'foo' : 'bar' }
    return JsonResponse(res)

路由

# devops/urls.py
from django.urls import path,re_path
from myapp import views

urlpatterns = [
   re_path('api/$',views.api)
]

视图

# myapp/views.py
from django.http import JsonResponse
def api(request):
    res={ 'foo':'bar','age':'30'}
    return JsonResponse(res)

验证

在这里插入图片描述

举报

相关推荐

0 条评论