django 学习笔记

django学习笔记

# todo  1.django项目创建与视图
Django过程
1.新建项目 new project
django
2.新建APP terminal
django-admin startapp user
3.项目settings
INSTALLED_APPS = 添加'user.apps.UserConfig',
4.user目录(APP)
新建urls.py
写入
from django.urls import path,re_path
from . import views

urlpatterns =[
    path('',views.index_handler,name='index')
]
#映射名可改为name='user_index'
#或在主url #或path('goods/',include('goods.urls''user'),namespace='user'),
#这两种改法一样,前一种更好用

5.user/views.py
写入
from django.shortcuts import render,HttpResponse

# Create your views here.

def index_handler(request):
    return HttpResponse('user index')

6.项目urls
修改
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('user/',include('user.urls')),
    #或path('user/',include(('user.urls','user'),namespace='user')),
]

7.运行manage.py       IDE右上edit       parameters输入runserver 801.正则路由映射参数的传递与接收
user/urls.py
添加
urlpatterns =[
    path('',views.index_handler,name='index'),
    #path 普通路由映射
    re_path('(\d+)',views.re_handler,name='re'),
    #(匹配数字长度》=1,定义一个处理器,名字为're')    re_path接收正则表达式
]
选中views.re_handler用alt+enter点击创建处理器名快速创建
def re_handler(request,num):
    return HttpResponse(num)
#创建num并返回

打开浏览器登录http://127.0.0.1:80/后面输123返回123


2.基础正则表达式
.除\n \r所有字符     \d数字大写D非数       \w数字字母下划线       \s空格
*出现次数》=0        +出现次数》=1        {n}出现次数等于n      {n,m}次数大于等n小于等m
$以结尾            ^以开头
.*常用于表示除换行符外所有字符
[0-9]列举与\d效果一致


3.用户主页案例
打开浏览器登录http://127.0.0.1:80/后面输name1返回 你好:name1
项目urls
修改
re_path('^(\w+.*\d+)$',views.user_handler),
#(匹配任意字符开头中间任意结尾为数字,定义一个处理器user_handler)    re_path接收正则表达式
user/views
添加
def user_handler(request,username):#对应处理器user_handler
    return HttpResponse('你好:%s'%username)





三
反向解析处理器     处理器反向解析得到对应的url地址

1.user/views添加
from django.shortcuts import render,HttpResponse,reverse

2.并在下面创建
def reverse_handler(request):
    print(reverse('user:index'))
    #reverse(总urls的namespace:app中对应的name值)
    print(reverse('user:re',args=('1234',)))
    #reverse(总namespace:app中Re,对应返回值num
    return HttpResponse('reverse')
    #return防止报错返回一个reverse

3.用于打印下面两个处理器对应的url地址
def index_handler(request):
    return HttpResponse('user index')
def re_handler(request,num):
    return HttpResponse(num)

4.在user/urls.py中添加刚才的reverse路由映射

path('reverse',views.reverse_handler),


5.启动服务
打开主页http://127.0.0.1:80/user/reverse
看到控制台记录返回了对应的url地址
/user/
/user/1234





四
路由与模板request与response对象
客户端请求request 服务器响应response
Django把request对象封装成类对象httprequest

request.对象
method关键字 返回请求方式get/post
    get会把请求放在url中 post会把请求放在headers里并加密保存
path关键字 返回页面路径不包括域名xxx.xxx.xxx为服务器域名后面的是页面路径
META关键字 封装请求头的数据 查看请求头封装那些参数可直接打印META
    REMOTE_ADDR返回客户端ip地址
    CONTENT_TYPE请求正文mime格式三种 1.-text/html HTML 2.-text/plain普通文本 3.-application/json json python中称字典前端称json
    json与字典的不同 key对应空值none/null 真假TF大写/tf小写
GET与POST关键字 数据保存在QueryDict对象里 分别通过.get和.getlist方式获取
FILES关键字 封装上传文件数据 客户端>服务器
COOKIES关键字 封装请求的cookies类字典对象 分别保存于客户端与服务端
session关键字 用于保存一些敏感的信息放置于服务器根据cookies上传值获取


1.request.对象
user/views找到添加
def index_handler(request):
    print(request.method)#打印请求方法
    print(request.path)#打印请求路径
    print(request.META['REMOTE_ADDR'])#打印访问者的ip地址
    print(request.META['CONTENT_TYPE'])#打印请求的mime类型
    return HttpResponse('user index')

启动服务 访问首页/user 看到控制台记录
GET
/user/
127.0.0.1
text/plain

打印请求头数据request.META user/views找到添加 完成刷新网页
def index_handler(request):
    print(request.META)
    return HttpResponse('user index')
看到控制台返回 一个字典就是META所有请求头中的数据
{'#ENVTSLOGSSS5272': '316779440', '#ENVTS......'}
遍历字典数据
for key in request.META.keys():
    print('%s=%s'%(key,request.META[key]))


2.response对象
HttpResponse对象
user/views  chrome浏览器F12打开浏览器控制台
return HttpResponse('文本类数据',
                    content='响应体',
                    content_type='MIME类型',#见上
                    status='状态码',#服务器告知客户端请求是否成功
#403服务器拒绝请求 400请求语法错误 404没找到对应页面
                    )
修改后打开chrome浏览器F12打开浏览器控制台
def index_handler(request):
return HttpResponse(
        content='HttpResponse',#响应文字
        content_type='text/plain',#响应类型
        status=500,#响应状态码,打开浏览器即使正常也会返回此码
    )


3.JsonResponse对象 会把字典对象转为json对象
jsonresponse是对httpresponse的一种封装
如果在jsonrespons传递对象中出现中文需在下面添加
json_dumps_params={'ensure_ascii':False}#保证中文的正确显示

user/views
添加 完后打开浏览器
from django.http import JsonResponse
def index_handler(request):
    return JsonResponse(
        {
            'edu':'优快云学院',
            'course':'Python',

        },
        json_dumps_params={'ensure_ascii': False}
        # 保证中文的正确显示
    )


4.重定向 在视图函数返回另一个对应的视图函数地址类似不用输入/user直接访问
user/views添加
from django.shortcuts import render,HttpResponse,reverse,redirect
在最下面定义
def redirect_handler(request):
    return redirect(reverse('user:index'))
通过reverse函数得到'user:index'的路由映射
再到user/urls加入重定向映射 刷新网页 网址添加/user/redirect发现直接跳转到/user
urlpatterns =[
    path('',views.index_handler,name='index'),
    re_path('(\d+)',views.re_handler,name='re'),
    re_path('^(\w+.*\d+)$',views.user_handler),
    path('reverse',views.reverse_handler),
    path('redirect',views.redirect_handler)
    # ^ 加入重定向handler的path
]



其他


项目文件夹
manage      通过本文件启动项目
templats    文件夹模板
settings    项目配置文件
user(APP)  子项
wsgi        部署服务器配置

项目urls含user/urls   网址user/urls对应views视图   views返回结果
网址对应视图的关系为路由映射

ctrl+shift+f10可快速启动环境了

联想输入设置
file> settings> live >livetemplats> python> 加号> abbre输入快捷键> 下面输入联想内容

#todo 2.模板的调用与传参
os.path.join(BASE_DIR,'templates')当前目录templates文件夹

1.模板原理
    之前 客户端-路由-视图-客户端 HTTPresponse
    现在 客户端-路由-视图-模板-客户端 HTML
2.模板调用
    2.1templates文件夹中创建html 例index.html
    视图中 runder传递方法 目标
    需要传递的参数
    def index_handler(request):
        return render(request,'index.html')



3.模板传参
定义context字典 作为第三个参数传给render 在index.html中能够得到context传入的参数
在上面的def下面添加

    #需要传递的参数
    def index_handler(request):
        context={
            'username':'name1',
            'password':'pass1'
        }#以上为index.html的上文
        return render(request,'index.html',context)
    在网页index.html中能够通过{{username}}取到刚才定义的name1


错误[Django]TemplateDoesNotExist
解决settings修改此处
    TEMPLATES = [
        {
            'DIRS': [os.path.join(BASE_DIR,'templates')],}]



模板层基础语法

1.参数输出
变量名不能以下划线开头
        context={
            'key1':'value1',
            'key2':['value1','value2'],
            'key3':{
                'key3_1':'value3_1',
                'key3_2':'value3_2',
            }
        }
参数输出 普通 列表 字典 {#...#}是模板语法中的注释
        {{key1}}
        {{key2.0}}{{key2.1}}
        {{key3.key3_1}}{{key3.key3_2}}

2.循环语句

        需要传递的参数
        def index_handler(request):
            context = {
                'hobbys': ['Python', 'Java', 'C']
            } # 以上为index.html的上文
            return render(request, 'index.html', context)

for in 遍历输出hobby    注意{{hobby}}

        {%for hobby in hobbys%}
            爱好:{{hobby}}<br/
        {%endfor%}

3.判断语句

        网页写法
        {%if 条件%} {%elif 条件%} {%else%} {%endif%}



4.得到视图函数的地址

        用url返回页面地址/t3
        def t4_handler(request):#t3地址
            return render(request, 't4.html')
            t3_handler的地址是:{ % url 'goods:t3' %}


        参数传递与返回
        def re_handler(request,num):
            return HttpResponse(num)
        {%url 'namespace:name' num%}#num在这里设定 同时显示返回



4.1以app goods为例 建好html文件 t1 t2 t3 t4

4.2配置主urls里的app path地址参数为''
    path('', include(('goods.urls', 'goods'), namespace='goods')),

4.3配置goods/urls定义路由映射t1 t2 t3 t4
    urlpatterns=[
        path('t1', views.t1_handler, name='t1'),
        path('t2', views.t2_handler, name='t2'),
        path('t3', views.t3_handler, name='t3'),
        path('t4', views.t4_handler, name='t4'),
        re_path('(\d+)', views.re_handler, name='re'),#正则
    ]

re_path 是正则映射参数
打开goods/views 右键上面标签split分屏


    def t1_handler(request):#提取普通 列表 字典参数
        context = {
            'key1': 'value1',
            'key2': ['value1', 'value2'],
            'key3': {
                'key3_1': 'value3_1',
                'key3_2': 'value3_2',
            }
        }
        return render(request, 't1.html', context)

    def t2_handler(request):#遍历传参显示
        context = {
            'hobbys': ['python', 'java', 'c']
        }
        return render(request, 't2.html', context)

    def t3_handler(request):#变色传参显示
        context = {
            'message': '这是一个根据style变色的信息',
            'style': 1,
        }
        return render(request, 't3.html', context)

    def t4_handler(request):#t3地址
        return render(request, 't4.html')
    t3_handler的地址是:{ % url 'goods:t3' %}

    def re_handler(request,num):#返回设定参数
        return HttpResponse(num)
    re_handler的地址是:{%url 'goods:re' 1 %}





模板过滤器
过滤器语法
过滤器
模板中对传递过来的数据进行修饰  ,再进行显示
语法
{{变量|过滤器关键字:参数}}

如果没有参数传递可以不写

1.常用过滤器使用
    safe 禁止HTML转义  length得到长度或元素个数    date 日期(y-m-d h:i:s)
    default:默认值    upper 转大写   lower转小写

2.多个过滤器配合:{{变量|过滤器1|过滤器2}}

    原样输出:
      ul
          li html_code:{{ html_code }}  /li
          li datetime:{{ datetime }}  /li
      /ul
    过滤器:(格式:变量|过滤器:参数)style变量不存在以默认值填充
      ul
          li safe禁止转义:{{ html_code|safe }}  /li
          li length:{{ html_code|length }}  /li
          li date输出日期:{{ datetime|date:'Y-m-d H:i:s' }}  /li
          li default默认值:{{ style|default:'默认值' }}  /li
          li upper转大写:{{ html_code|upper }}  /li
          li lower转小写:{{ html_code|lower }}  /li
          li 多个过滤器:{{ html_code|lower|safe }}  /li

      /ul



模板复用与block提取
子类继承父类调用和复写
1.模板继承{%extends'xxx.html'%}继承目标html的所有信息

2.block选定标签 end在选定标签末尾 定义与重写中间的内容 在父模板中定义

    {%block 代码模块名称 %}
        中间内容
    {%endblock%}

调用父模板中的代码:{{block.super}}


静态文件访问建立 不是下载

1.建立static文件把静态文件导入
    项目settings
    找到STATIC_URL='/static/'
    在下面添加
    STATICFILEDIRS=[os.path.join(BASE_DIR,文件夹名)]

2.在app视图函数中添加引用路径
    def index_handler(request):
        file_s=os.listdir(#文件列表显示
            os.path.join('static','file')#前路径,后文件夹名
        )
        return render(request,'index.html',context={'file_s':file_s})
        #传入路径参数
3.建立index.html
    body
    <ul>里面建立无序列表 循环
        {%for file in file_s%}
            <li>        #路径括号里链接  接括号里文件名
                <a href='/static/file/{{file}}'>{{file}}</a>
            </li>
        {%endfor%}
    </ul>

#todo 3.cookie的安全性和生命周期

1.cookie的原理
由服务器生成 存储在浏览器中的 键值对数据
每个域名的cookie相互独立
访问域名为A的url地址 会把a域名下的cookie一起传递到服务器
cookie可以设置过期时间

2.cookie的设置与获取

设置格式response
response=HttoResponse()
response.set_cookie(key,value,max_age=60*60)
#过期时间默认值为none关闭浏览器即删除 此设过期时间60*60return response

获取request
value=request.COOKIES.get(key,None)#后key是键

案例
cookie的发送和接受
app/urls
urlpatterns添加

re_path('set_cookie/(.+)/(.+)', views.set_cookie_handler, name='set_cookie'),
# 发送 设置cookie 正则表达式 第一加号是键 第二加号是值
re_path('get_cookie/(.+)', views.get_cookie_handler, name='get_cookie'),
# 接收 读取根据键读取

发送 在app/views里添加 先set后get

def set_cookie_handler(request,key,value):#键值
    response=HttpResponse()
    response.set_cookie(key,value,max_age=60*60)
    return response

接收

def get_cookie_handler(request,key):#接收cookie
    value =request.COOKIES.get(key)#提取value
    return HttpResponse(value)#在浏览器中输出value值

运行项目打开浏览器
http://127.0.0.1:8000/set_cookie/username/user1
http://127.0.0.1:8000/get_cookie/username
#得到返回值user1

3.cookie的安全性
cookie是存储在客户端 即浏览器 具有不安全性
对于敏感信息 应该加密 或保存在服务端 session





session的原理和使用
1.session原理
基于cookie
把敏感信息以加密方式保存在服务器 用户名 密码
服务器创建sessionid 并把客户端的sessionid 与数据库的sessionid对应起来 能设置过期时间

2.session的设置
类似字典 实质class类
#设置
request.session[key]=value
#设置过期时间
request.session.set_expiry(60*60)
#获取 不设置过期时间 django默认2周
value=request.session.get(key)
#如果没有key返回None
案例
app/urls
urlpatterns添加
re_path('set_session/(.+)/(.+)',views.set_session_handler,name='set_session'),
#设置session 正则表达式 第一加号是键 第二加号是值
re_path('get_session/(.+)',views.get_session_handler,name='get_session'),
# 接收 读取根据键读取


项目settings设置 DATABASE 找到对应数据库 打开数据库 看到表结构 django_session

在app/views里添加
def set_session_handler(request,key,value):#生成
    request.session[key]=value
    #request.session.set_expiry(60*60)
    return HttpResponse('设置成功')

def get_session_handler(request,key):#获取
    value=request.session.get(key)
    return HttpResponse(value)


3.session的获取
4.flush()clear()命令
案例
app/urls
urlpatterns添加

path('flush',views.flush_session_handler,name='flush'),
#删除 数据库对应表数据
path('clear',views.clear_session_handler,name='clear'),
#清空sessionid对应的数据

在app/views里添加

def flush_session_handler(request):#删除数据库对应表数据
    request.session.flush()
    return HttpResponse('flush')

def clear_session_handler(request):#清空sessionid对应的数据  清除后返回结果是NONE
    request.session.clear()
    return HttpResponse('clear')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值