你会有这样的感觉吗?你看着一个陌生人,可是你会觉得,心里很难过很难过,好像已经和那个人认识了很久很久,但是你想不起来他。你只能在心底有一点点的潜意识。

编写视图函数

在Flask的路由中可以直接设置不同URL请求的处理逻辑,Django把这些都存储到urls.py文件当中,方便统一管理
,那么如何才能获取URL中请求的数据呢?

使用如下方法可以获取URL参数请求,首先在应用的views.py文件中编写如下文件

from django.http import HttpResponse
def show(request,show_id):
    return HttpResponse('当前获取URL参数为:{}'.format(show_id))

然后在应用的urls.py文件编辑

from django.urls import path
from .views import show
urlpatterns = [
path('show/<int:show_id>',show,name='show')
]

最后访问

http://127.0.0.1:8080/show/2 

即可获取到URL中的结果

如何往模板中传数据

Django中的模板语法和Jinja2语法完全一致,基本上可以照搬过来使用 Jinja2语法

但是往模板中传递数据和FLASK有所不同,FLASK可以传递字典,字符串,列表等等,但是Django中传递数据到前端
只能通过字典的格式数据传递。

首先你在应用目录下的views.py中编辑如下

def test(request):
    detail = 6666666
    return render(request,'test.html',{'data':detail})
    # 注意:这里传入的数据类型必须是字典,data是字典的key,也是前端模板中接受的代表值

然后在根目录的templates文件夹中新建一个test.html文件

内容为:

{{data}}

最后在应用目录下的urls.py中编辑如下

from .views import test
urlpatterns = [
path('test/',test,name='test')

]

然后访问

http://127.0.0.1:8000/test

404页面

当捕获到异常的时候,需要做异常处理,使用自带的404页面

from django.http import Http404
def test(requests):
    try:
        a = 1+'aaa'
        # 这里模拟出错,一般像数据库找不到数据就会报错
    except:
        raise('页面发生错误')
    render(request,'test.html',{'data':'随便写点啥,反正也不会执行到这里'})

HttpRequest对象功能

转载来源

request.path       # 获取访问文件路径

request.method属性   #获取请求中使用的HTTP方式(POST/GET)

request.body      #含所有请求体信息 是bytes类型

request.GET        #GET请求的数据(类字典对象)  请求头中的url中?后面拿值
request.POST     # POST请求的数据(类字典对象) 请求体里拿值

request.COOKIES     #包含所有cookies的标准Python字典对象;keys和values都是字符串。


request.FILES:      包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中
                 name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:

                 filename:      上传文件名,用字符串表示
                 content_type:   上传文件的Content Type
                 content:       上传文件的原始内容


request.user:       是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前
                 没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
                 可以通过user的is_authenticated()方法来辨别用户是否登陆:
                 if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
                 时该属性才可用

request.session:      唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用

request.GET.get('name')    拿到GET请求里name的值

如果某个键对应有多个值,则不能直接用get取值,需要用getlist,如:

request.POST.getlist("hobby")



请求url:http://127.0.0.1:8000/index.html/23?a=1

request.path : 请求路径       
       request.path结果为:/index.html/23

request.get_full_path()
       request.get_full_path()结果为:/index.html/23?a=1

要获取连接用户的IP地址

if request.META.get('HTTP_X_FORWARDED_FOR'):
    login_ip = request.META['HTTP_X_FORWARDED_FOR']
else:
    login_ip = request.META.get('REMOTE_ADDR','None')

HttpResponse对象功能

转载来源

render 函数

将指定页面渲染后返回给浏览器

render(request, template_name[, context])

结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。

参数:
request: 用于生成响应的请求对象。

template_name:要使用的模板的完整名称,可选的参数

context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。

content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。

status:响应的状态码。默认为200。

redirect 函数

参数可以是:

一个模型:将调用模型的get_absolute_url() 函数

一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称

一个绝对的或相对的URL,将原封不动的作为重定向的位置。

默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。

示例:

你可以用多种方式使用redirect() 函数。

传递一个对象
将调用get_absolute_url() 方法来获取重定向的URL:

from django.shortcuts import redirect

def my_view(request):
    ...
    object = MyModel.objects.get(...)
    return redirect(object)

传递一个视图的名称
可以带有位置参数和关键字参数;将使用reverse() 方法反向解析URL: 

def my_view(request):
    ...
    return redirect('some-view-name', foo='bar')

传递要重定向的一个硬编码的URL

def my_view(request):
    ...
    return redirect('/some/url/')

也可以是一个完整的URL:

def my_view(request):
    ...
    return redirect('http://example.com/')

默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向:

def my_view(request):
    ...
    object = MyModel.objects.get(...)
    return redirect(object, permanent=True)  

对比render与redirect:

render: 只是返回页面内容,但是未发送第二次请求
redirect:发送了第二次请求,url更新

总结两者区别:    

第一,render返回一个登陆成功后的页面,刷新该页面将回复到跳转前页面。而redirect则不会

第二,如果页面需要模板语言渲染,需要的将数据库的数据加载到html,那么render方法则不会显示这一部分,render返回一个登陆成功页面,不会经过url路由分发系统,也就是说,不会执行跳转后url的视图函数。这样,返回的页面渲染不成功;而redirect是跳转到指定页面,当登陆成功后,会在url路由系统进行匹配,如果有存在的映射函数,就会执行对应的映射函数。