Django简单使用

创建项目

**先cd 到python里 script里 D:\programe\Scripts ****
然后执行创建项目命令 django-admin startproject helloworld_project #helloworld_project是项目名
**然后再切换进项目文件夹 执行python manage.py runserver 启动服务

diango起步**
django安装
**pip install django==2.0.4

创建项目:**
要先切换到你的python里的script里 里面有django-admin.exe ****
执行django-admin startproject myproject 就创建了一个项目 myproject是项目名
**会在当前路径创建一个myproject文件夹 就是你的项目

开启开发服务器

cd myproject  #进入项目目录
python manage.py runserver #开启服务
python manage.py runserver 7000 #改变服务监听端口  默认为8000
python manage.py runserver 0:8000 #改变服务监听IP:端口

终止服务 : ctrl+c

项目文件夹

manage.py :用来管理当前项目的一个命令工具
myproject/:项目主文件夹
myproject/__init__.py :空文件,用来指明当前的myproject为一个可导入的模块包
myproject/urls.py:项目主要路由配置文件
myproject/wsgi.py:项目部署WSGI并发服务器时所需要的配置文件

Settings.py**
该文件是整个项目的主控文件,其中相关配置选项如下
**https://docs.djangoproject.com/zh-hans/2.0/ref/settings/

**-BASE_DIR: 当前项目工作目录,用来在每一次开启项目时动态找到相关资源路径 **

  • **SECRET_KEY: 加密的hash值以及保护某些签名数据的关键密钥 **
  • **DEBUG: 调试模式 **
  • **ALLOWED_HOSTS: 有哪些主机或域名可以访问当前django站点,如设置为*代表全部可访问。 **
  • **INSTALL_APPS: django项目中所有使用的应用名称,自创建子应用也要加到这里,不然ORM数据库无法被识别到! **
  • **MIDDLEWARE: django中间件,用来在request或reponse过程中添加功能,比如确保安全性,传输保存Session等 - SecurityMiddleware: xss脚本过滤,一些安全设置 **
  • **SessionMiddleware: session支持中间件,在每次用户访问django项目时,添加session对每一个浏览器 **
  • **CommonMiddleware: 通用组件,比如为路由添加末尾斜杠 **
  • **CsrfViewMiddleware: 防跨站请求伪造令牌,为客户端添加csrf_token密钥,在表单提交时需提交该值 **
  • **AuthenticationMiddleware: admin用户组件,每个request对象都会被添加admin下的user属性 **
  • **MessageMiddleware: 消息中间件 展示一些后台消息给前端 **
  • XFrameOptionsMiddleware: 防止欺骗点击攻击出现;自身页面被嵌入到他人页面中,点击欺骗
创建子应用

来搞个Hello world**
django创建子应用
项目和应用有啥区别?
应用是一个专门做某件事的网络应用程序——比如博客系统,或者公共记录的数据库,或者简单的投票程序。
**项目则是一个网站使用的配置和应用的集合。项目可以包含很多个应用。应用可以被多个项目使用

python manage.py startapp myapp
app目录
-admin.py :app在admin注册展示时需要的文件
-views.py :app的功能视图函数文件
-model.py:app需要使用数据库时的文件
-urls.py :当使用include路由分发时,每个app应该有他自己的子路由文件,这个是默认没有创建好的

视图函数**
打开app下的views.py文件
Web访问起始就是通过一个url链接地址访问到服务器上的一个函数
**在views.py中我们通过编写函数的形式,接收用户请求的request并返回一个response

#每一个视图函数都需要有一个必须参数request,用来接收用户访问时的请求内容
from django.http import HttpResponse
def index(request):
    return HttpResponse("<h1>Hello world</h1>")

HttpResponse函数用来像用户返回一个字符串

路由配置**
**创建好了一个可以在请求时返回H1标签的视图函数,但是现在通过浏览器还是访问不到需要我们为这个app下的函数进行路由配置

第一种简单的路由配置,直接在主控路由文件下,找到这个视图函数

#myproject/urls.py
from django.contrib import admin
from django.urls import path
from myapp import views
urlpatterns=[
    path('admin/',admin.site.urls),  #admin控制界面路由
    path('',views.index)
    #path函数第一个参数为访问地址,空字符串代表:当用户直接访问首页时
    #第二个参数代表访问该地址时对应的视图函数,我们引入了app下的views中的index视图函数
]

以上将视图函数的查找直接写到主控路由并不是最好的办法,我们的项目通常会有非常多的路由配置项,如果都堆到这个文件中肯定是非常乱的,难以维护;

我们可以在对应app下创建一个子路由控制文件,并在其中设置视图的路由配置

#myapp/urls.py
from diango.urls import path
from . import views
urlpatterns=[
    path('',views.index)
]

现在虽然配置了app下的路由文件,但是访问时,是看不到对应试图的结果**
**这是因为默认的url查找动作将会从主控路由文件开始,我们还需要在主控路由文件下进行路由分发设置,让主控路由可以找到子app下的路由

#myproject/urls.py
from django.contrib import admin
from django.urls import path,include
from myapp import views
urlpatterns=[
    path('admin/',admin.site.urls),
    path('',include("myapp.urls")),   #里面必须是双引号
    #函数include(),允许引用其他URLconfs
]
路由

路由查找流程
1、查找主控路由文件下的urlpatterns全局变量,这是一个序列数据类型,其中每一个元素都是对应的一个路由匹配规则
2、如果在规则中查找到符合匹配规则的,则执行其中的对应执行函数
3、如果对应的不是一个执行函数,而是一个include路由包含,那么截断与此项匹配的URL的部分,并将剩余的路由字符串发送到include所包含的子路由文件中以供进一步处理
4、如果没有匹配到的任何结果,django默认抛出page not found (404)

注意:Django的路由不考虑HTTP请求方式,仅根据URL进行路由,即,只要URL相同,无论POST、GET等那种请求方式都指向同一个操作函数

path:
path函数用来处理一个路由对应的事件
path(route,view,name)
#route :匹配规则,是一个字符串
#view: 对应的视图函数
#name:未来我们会用到他,用来为匹配规则命名,这样方便日后修改路由而不影响全局下的路由使用

re_path:
re_path是path函数的加强版;
可以在re_path函数的第一个位置的字符串参数,写入一个标准Python正则表达式,其余参数与path相同
注意:匹配模式的最开头不需要添加/,因为默认情况下,每个url都带一个最前面的/,既然大家都有的部分,就不用浪费时间特别写一个了。

模板页面:
返回一个字符串这肯定是不行的,太low了,也不好看,现在来返回一个正式的HTML页面
并在HTML页面中加入模板变量,由视图函数动态传递值:

配置django中模板页面的保存路径,在项目目录下的settings.py文件中
#myproject/settings.py
TEMPLATES=[
	{
		'BACKEND': 'django.template.backends.django.DjangoTemplates', 
		 'DIRS': [os.path.join(BASE_DIR,'template')], # 就是这一行 设置静态模板路径 
		'APP_DIRS': True,
		'OPTIONS': {
			'context_processors': [ 
				'django.template.context_processors.debug', 
				 'django.template.context_processors.request', 
				 'django.contrib.auth.context_processors.auth', 
				'django.contrib.messages.context_processors.messages', 
			],
		},
	},
]

创建template目录并在其中创建index.html文件

<!DOCTYPE html> <html lang="en"> <head>    <meta charset="UTF-8">    <title>hi</title> </head> <body>    <h1>{{ message }}</h1> </body> </html>
在HTML页面中,我们并没有明确指出H1标签的内容;通过一个{{ message }}来等待接收视图函数传来的数 据,在HTML页面中这样的变量也叫做模板变量,常用双大括号语法 接下来修改之前的视图函数,由视图函数传递变量给到HTML页面

#myapp/views.py from django.shortcuts import render def index(request):    #return HttpResponse("<h1>Hello world</h1>")    content = {        "message":"你好,世界" #此处的key值message对应页面中我们写的{{ message }}        }    return render(request,'index.html',content)

render
render函数用来返回一个模板页面,并将一个字典组合成的模板变量传递到模板页面上,完成页面的渲染
render(request,template_name,context=None)
#返回一个HTTP响应
#request:固定接收request请求
#template_name:为一个可以找到的模板页面
#context:模板页面所需模板变量

模板变量:

在django中的HTML页面,不光可以编写原本的标签等内容,还可以像Vue一样在页面中使用双大括号, 来提前定义一些模板变量 模板变量可以由后台视图函数构建一个字典数据类型传递, 字典的key是模板变量名,value值该模板变量对应的数据 当然,模板变量的内容远不止此,还会再后面继续为大家叙述

静态文件 
虽然有了模板页面,可以来展示一些标签的效果,但是整个HTML还是感觉很丑陋,所以,我们还要继续引入 一些类似css、img这样的静态资源,来装饰我们的页面 在django中模板页面的静态资源使用,不能像之前写HTML代码直接引入,需要我们首先在项目中创建目录保 存对应的静态资源

在settings中配置静态文件保存目录,添加如下内容:
STATICFILES_DIRS = (    os.path.join(BASE_DIR, 'static'), ) # STATICFILES_DIRS 该配置项用来告诉django在查找静态资源时,应该访问哪个目录

在项目中创建static目录,static目录下创建专门保存图片的img目录,在里面存一张图片1.jpg 
此时的目录结构
myproject/    myproject/    myapp/    template/    static/        img/            1.jpg

有了图片,接下来在模板页面中去引入并使用它,打开index.html进行修改:
<!DOCTYPE html> <html lang="en">    {% load staticfiles %} <head>    <meta charset="UTF-8">    <title>hi</title> </head> <body>    <h1>{{ message }}</h1>    <img src='{% static "img/1.jpg" %}' alt="图片"> </body> </html>

这里用到了一个特殊语法: {% tag %} 这个叫静态标签,静态标签不同于模板变量,静态标签经常用来 加载数据,或创建逻辑,比如之后我们要学到的 {% if %} ,使用静态标签可以方便我们在模板页面上实 现某些只有在后台代码中才可以实现的逻辑功能
在页面中要引入静态资源,图片,CSS,JS文件,在引入时都需要通过 {% static "path" %} 来进行引 入,并且在模板页面头部需要使用 {% load staticfiles %} 标签进行静态资源的加载


路由传参、重定向

路由传参:

在myapp下的views模块里
def index(request,x):        #视图函数要接收参数
    content={'message':'x=%s'%x}
    return render(request,'index.html',content)


myapp.urls里:
urlpatterns=[
    path('<x>/',views.index)
]


当你输入网址http://127.0.0.1/a时就进入index.html页面了,x的值为a,   a可以替换其他值,是传过去的参数,没有转换器的限制自己写什么都可以,

重定向
要引入redirect
from django.shortcuts import redirect

def index(request):
    return render(request,'index.html')

def index2(request):
    return redirect(to='/',permanent=False)   #to后面的参数是路由网址后面的参数,这个是重定向到http://127.0.0.1/
    return redirect(to='/myapp/',permanent=False)
是重定向到http://127.0.0.1/myapp
permanent:如果设置为True,将返回301状态吗,代表永久重定向

302:临时重定向,旧地址资源临时用不了,搜索引擎只会暂时抓取新地址的内容而保存旧的地址
301:永久重定向,旧地址资源已经不复存在了,搜索引擎不光会抓取新地址的内容,还会替换旧地址为新地址

使用name进行重定向
要用到reverse
from django.shortcuts import reverse

urlpatterns=[
    path('<x>',views.index,name='left')
]

return redirect(reverse('left',args=('aaa',)))   #left为name值,aaa为传过去的参数,重定向到index该视图函数里

<a href="{% url 'myapp:right' 123 'okj' %}">点击进入右页面</a>


post获取数据
def login(request):
    imgname=imgName(time.time())
    if request.method=='POST':
        name=request.POST.get('name')
        age=request.POST.get('age')
        gender=str(request.POST.get('gender'))
        phone=request.POST.get('phone')
        joy=','.join(request.POST.getlist('joy',default=None))
        f=request.FILES.get('head')
        head = os.path.join(settings.STATICFILES_DIRS[0],'img/'+imgname+'.'+f.name.split('.')[-1])
        if models.Message.objects.filter(name=name).first():
            name=name+'2'
        models.Message.objects.create(name=name,age=age,gender=gender,phthon=phone,joy=joy,head=head)
        with open(head,'wb') as fp:
            if f.multiple_chunks: #判断到上传文件为大于2.5MB的大文件
                for buf in f.chunks(): #迭代写入文件
                    fp.write(buf)
            else:
                fp.write(f.read())
        return redirect(reverse('show'))
    return render(request,'login.html')
创建唯一的文件名
import time
import hashlib
m=hashlib.md5()
m.update(str(time.time()).encoude())
dir(m)
m.hexdigest()
'06099d55197f1d22da3caaa125ab0695'


hashlib模块
m = hashlib.md5() # md5对象,
m.update(str(time.time()).encode()) # 要对哪个字符串进行加密,就放在这里,同时还有解码
m.hexdigest() # 拿到加密字符串,以16进制的方式显示





strftime  strptime



import time
import hashlib
# Create your views here.

def imgName(str_):
    m=hashlib.md5()
    m.update(str(str_).encode())
    return m.hexdigest()

def login(request):
    imgname=imgName(time.time())
    if request.method=='POST':
        name=request.POST.get('name')
        age=request.POST.get('age')
        gender=str(request.POST.get('gender'))
        phone=request.POST.get('phone')
        joy=','.join(request.POST.getlist('joy',default=None))
        f=request.FILES.get('head')
        head = os.path.join(settings.STATICFILES_DIRS[0],'img/'+imgname+'.'+f.name.split('.')[-1])
        if models.Message.objects.filter(name=name).first():
            name=name+'2'
        models.Message.objects.create(name=name,age=age,gender=gender,phthon=phone,joy=joy,head=head)
        with open(head,'wb') as fp:
            if f.multiple_chunks: #判断到上传文件为大于2.5MB的大文件
                for buf in f.chunks(): #迭代写入文件
                    fp.write(buf)
            else:
                fp.write(f.read())
        return redirect(reverse('show'))
    return render(request,'login.html')

常见请求方式

POST和GET是HTTP协议定义的与服务器交互的方法。

GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。另外,还有PUT和DELETE方法

get

常用来从指定地址请求数据;

如果需要在请求时提交某些数据,则以路由形式传递参数,查询Query字符串如下格式所示:

https://www.baidu.com/?key=abc&pos=shanxi
  • get请求可被浏览器缓存,保存在历史记录中
  • get不应在使用敏感数据时使用,明文包路在请求地址中
  • get有长度限制
post

向指定的资源提交要被处理的数据

使用POST,提交的数据保存在HTTP协议中的消息主体部分

  • post请求不会被浏览器缓存
  • post提交数据长度无限制
  • post比get更加安全

request

如果说 urls.py 是 Django 中前端页面和后台程序桥梁,那么 request 就是桥上负责运输的小汽车 可以说后端接收到的来至前端的信息几乎全部来自于requests中

request.method

获取当前用户请求方式,

请求方式字符串为纯大写:‘GET’、'POST’

如用户以get方式发起请求,对应代码中获取到的结果以及在判断时像是这样

def index(request):
    if request.method == 'GET':
        …
request.GET

当用户通过get方式请求站点,并在路由中提供了查询参数,可以通过该属性获取到对应提交的值

def index(request):
    print(request.GET) 
    # <QueryDict: {'name': ['jack'], 'id': ['1']}>
    print(type(request.GET)) 
    # <class 'django.http.request.QueryDict'>
    name_ = request.GET.get('name')
    id_ = request.GET.get('id')
    content = '%s:%s' % (name_,id_)
    return HttpResponse(content)

request.GET是一个类似字典的数据类型:QueryDict

其中也支持类似对字典的get或直接dict.[key]键值访问方式,当然使用get方式进行对应key获取会更好,因为get在访问不到时不会报错

  • 如果定义了如上所示的视图函数,那么在访问连接时,我们可以通过路由传参:
http://127.0.0.1:8000/?name=jack&id=1
  • 这里对应页面会显示的结果:
jack:1
  • 注意**:使用GET方法在连接中进行参数提交,类型均是字符串**


request.POST

获取用户以post形式提交的数据并保存在后台,为类字典数据,这里和request.GET是一个东西;

在网页中,一般我们通过html的表单进行数据的提交,POST方式可以提交空数据

  • 因为涉及到了表单页面,所以我们先来弄一个HTML页面

——————————————————————————————————————————

  • request.POST.get(key, default=None)
    • 返回对应key值的数据中的****最后一个****数据单独返回;key值不存在,取default的值返回。

要想真正拿出所有的结果,应该使用getlist函数

  • request.POST.getlist(key, default=None)
    • 将对应key值的所有数据以****一个列表**形式返回;key值不存在,取default的值返回
      **用来获取多选框的值 key为name值

——————————————————————————————————————————

request.FILES

接收用户上传文件及相关信息。同样类似于 request.POST,提取到的数据为一个类字典的数据类型,包含所有文件上传的信息

  • f = request.FILES.get('upload_file')
    • file_data = f.read():读取整个上传文件的内容,适合小文件上传
    • yiled = f.chunks():返回一个类似生成器(<class 'generator'>)的数据,每一次读取按块返回文件,可以通过for迭代访问其中数据;适合上传大文件到服务器。
    • f.multiple_chunks():返回文件大小,当文件大小大于2.5M时,返回True,反之返回False,可以通过该函数来选择是否使用chunks方法或read直接存储。

      如果想要修改这个文件判定的默认值,可以通过:FILE_UPLOAD_MAX_MEMORY_SIZE在settings文件下进行设置

    • f.content_type:上传文件时头部中的Content-Type字段值,参考MIME类型
    • f.name:上传文件名字
    • f.charset:上传文件编码
    • f.size: 上传文件大小,字节为单位:byte

创建好静态资源目录,并在下面创建一个img文件夹,保存我们即将上传的图片;

完成上传文件的HTML表单页面**
要在页面头标签里加这个
**{% load staticfiles %}

<form action="/" method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="upload_file" />
    <input type="submit" value="提交">
</form> 
<img src="{% static 'img/1.jpg' %}" alt="这是一张图片">

当你从数据库中展示图片时:
<img src="{% static x.img_path %}">

<!-- 这里使用的是即将要上传的文件名字,只做文件是否上传成功的简单测试 -->

注意**:上传文件的页面表单,一定要记得设置属性**enctype="multipart/form-data"

  • 视图函数如下编写,接收上传图片,并保存在静态目录下刚才创建好的img目录中
from django.shortcuts import render
from pro2 import settings
# Create your views here.
from myapp import models
from django.http import HttpResponse
import os

def index(request):
    if request.method == "POST":
        f = request.FILES.get("upload_files")
        path = os.path.join(settings.STATICFILES_DIRS[0],'img/'+f.name)
        # 上传文件本地保存路径
        with open(path,'wb') as fp:
            if f.multiple_chunks: #判断到上传文件为大于2.5MB的大文件
                for buf in f.chunks(): #迭代写入文件
                    fp.write(buf)
            else:
                fp.write(f.read())
            return HttpResponse("Success!")
    return render(request, 'index.html')

测试上传一个名为1.jpg的图片,如果成功上传,那么后台static目录下会出现该图片,并且模板页面也可以展示对应图片效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值