Django工程搭建与配置文件

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Feng_xiaowu/article/details/102731000

Django工程搭建

创建django项目

  • 创建一个目录用于保存Django项目,如mkdir ~/Desktop/demo
  • 进入项目文件夹,cd ~/Desktop/demo
  • 创建虚拟环境
    • mkvirtualenv + django(虚拟环境名称,可自选)
  • 安装Django包
    • pip install django=1.11.11
    • 可自选版本
  • 创建Django工程
    • django-admin startproject linux_django
    • 名称可自取

工程目录说明

在这里插入图片描述

  • 与项目同名的目录,此处为demo
  • settings.py是项目的整体配置文件
  • urls.py是项目的URL配置文件
  • wsgi.py是项目与WSGI兼容的Web服务器入口
  • manage.py是项目管理文件,通过它进行管理项目

启动django

  • 使用命令来启动

    python manage.py runserver
  • 使用其他端口启动

    python manage.py runserver 8000
  • 如果想让其他电脑可以查看我们的django项目,需设置:

    • python manage.py 0.0.0.0:8000
    • 修改settings文件中的ALLOWD_HOSTS=[*]

创建子应用

  • python manage.py startapp user

    后面接子应用的名称

  • 配置子应用路由

    1. 在主应用的settings中INSTALLED_APPS中添加子应用的名字,使用引号引起来

    2. 在主路由中导入子应用的路由(使用include)

      from django.conf.urls import url, include
      from django.contrib import admin
      
      urlpatterns = [
          url(r'^admin/', admin.site.urls),
          url(r'^user/', include('user.urls')),
          url(r'^cookie/', include('cookies.urls')),
          url(r'^class/', include('classview.urls')),
          url(r'^tem/', include('tem.urls')),
      ]
      
    3. 在子应用中创建urls.py文件,配置路由

      from django.conf.urls import url
      from . import views
      
      urlpatterns = [
          url(r'^files/$', views.files),
          url(r'^json/$', views.jsondata),
      ]    
      

配置文件

  • 在主应用的settings中配置static静态文件

    STATIC_URL = '/static/'
    
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR,'static')
    ]
    
  • 语言和时区

    扫描二维码关注公众号,回复: 7584415 查看本文章
    # 默认时间和时区为英语和UTC标准时区
    LANGUAGE_CODE = 'en-us'
    TIME_ZONE = 'UTC'
    
    # 将语言给为中文,时区改为上海
    LANGUAGE_CODE = 'zh-hans'
    TIME_ZONE = 'Asia/Shanghai'
    

路由解析顺序

Django接受一个请求,从主路由文件中的urlpatterns列表以由上至下的顺序查找对应路由规则,若发现规则为include包含,则在进入被包含的urls中的urlpatterns列表由上至下进行查询,但有可能下层的路由会被上层的路由屏蔽掉

urlpatterns = [
    url(r'^say', views.say),
    url(r'^sayhello', views.sayhello),
]

这种情况下,即使访问sayhello/路径,但实际进入到say视图中执行了,所以设置路由的时候推荐使用贪婪匹配,可以避免访问出错的情况,如以下模式:

urlpatterns = [
    url(r'^say/$', views.say),
    url(r'^sayhello/$', views.sayhello),
]

路由结尾斜线/的说明

  • 定义路由时,通常以斜线结尾,好处是用户访问不以斜线结尾的相同路径时,Django会把用户重定向到以斜线结尾的路径上,而不会返回404不存在

  • 带斜线与不带斜线的区别

    比如模式r’^user/$’,则当你请求的时候写http://localhost:8000/user或者http://localhost:7999/user/都行,但不带/会多一次重定向,不会报错;如果模式后面没有/,那请求的时候带斜线则会报错

  • 说明:

    虽然路由结尾带/能带来上述好处,但却违背了HTTP中URL表示资源路径的设计理念,所以是否携带/以所属公司定义风格为准

操作项目

http请求方法

  • get请求-----对应数据表的查询操作

    • 以"/"方式,按顺序传参

      • 路由定义

        url(r'^index/(\w+)/(\d+)$' ,views.index)
        
      • 函数视图定义

        def index(request,name,age):
            print(name)
            print(age)
            return HttpResponse('通过get方法进行传参')
        
      • 浏览器中传递的url

        http://127.0.0.1:8000/user/index/laowang/25
        
    • 以"/"方式,按照正则名称来传参

      • 路由定义

        url(r'^person/(?P<name>\w+)/(?P<age>\d+/$)',views.person)
        
      • 函数定义

        def person(request,age,name):
            print(name,age)
            return HttpResponse('right')
        
      • 浏览器中访问的地址

        http://127.0.0.1:8000/user/person/laowang/25
        
    • 以"?"的形式传参,通过使用request.GET.get()来获取

      
      # 以?的方式进行传参的获取方法
      def ff(request):
          name = request.GET.get('name')
          age = request.GET.get('age')
          # 通过getlist方法获得的为一个列表类型
          namelist = request.GET.getlist('name')
          print(name,age)
          print(namelist)
          return HttpResponse('ok,拿到了')
      
      # 以"?"进行传参路由配置
        url(r'^ff/$', views.ff),
      
      
  • post请求----对应数据表的增加操作

    • 获取参数的方法

      
      def post(request):
          name = request.POST.get('name')
          age = request.POST.get('age')
          
          # getlist可以获取多个参数值相同的参数,返回一个列表
          namelist = request.POST.getlist('name')
          agelist = request.POST.getlist('age')
          print(name, age)
          print(namelist, agelist)
          return HttpResponse('post')
      )
      
       # post方法
        url(r'^post/$', views.post),
      ​```
      
  • put请求----对应数据表的增加修改

    • 获取参数

      def put(request):
          # 结果为一个字节类型的数据,通过request.body来获取数据
          data = request.body
      
          # 把字节转为字符串
          data = data.decode()
      
          # 把字符串转为字典,则可以通过字典的方法获得值和修改值
          data = json.loads(data)
          print(data)
          data["name"] = "laowang"
          print(data)
          return HttpResponse('OK')
      
      # put方法
          url(r'^put/$', views.put),
      
  • delete请求—对应数据表的删除操作

    • 获取参数

      def delete(request):
          data = request.body
          data = json.loads(data.decode())
          print(data)
          return HttpResponse('right')
      
      # delete方法
          url(r'^delete/$', views.delete),
      

上传文件(函数视图)

import os
# 使用FILES来进行文件上传操作
def file(request):
    #	返回一个file对象
    file = file.FILES.get('img')
    #	获取文件名
    filename= file.name
    #	获取图片后缀
    _,ext = os.path.splitext('filename')
    #	对文件进行新的名称拼接
    new_file_name = datetime.datetime.now().strftime('%Y%m%d%H%M%S') + ext
    #	拼接图片保存地址
    filepath = os.path.join(BASE_DIR,'image',new_file_name)
    #	保存图片
    with open(filepath,'ab') as fp:
        for chunks in file.chunks():
            fp.write(chunks)
            
    return HttpResponse('right')

传递json数据类型(JsonResponse)

def jsondata(request):
    data = {"name":"laowang","age":20}
    return JsonRespone(data)
	
    # JsonResponse也可以上传列表或者元组,但要把safe的值设为false
    data = ['a','b','c']
    return JsonResponse(data,safe=False)
    
	
  • json数据类型的标准写法
    • 每个键都必须使用使用双引号

    • 每个value(除数值)必须使用双引号

    • 最后一条数据末尾不适用逗号

QueryDict对象和Query String

  • QueryDict与dict的区别

    dict只能一个键对应一个值;QueryDict可以一个键对应多个值

  • Query String获取请求路径中的查询字符串参数,可通过request.GET来获取,返回一个QueryDict对象

    def qs(request):
        a = request.GET.get('a')
        b = request.GET.get('b')
        alist = request.GET.getlist('a')
        print(a)  # 3
        print(b)  # 2
        print(alist)  # ['1', '3']
        return HttpResponse('OK')
    

注意:

  1. ​查询字符串不区分请求方式,即使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据
  2. 获取客户端地址可以使用HttpRequest对象的META属性
def qs(request):
    a = request.GET.get('a')
    b = request.GET.get('b')
    alist = request.GET.getlist('a')
    print(a)  # 3
    print(b)  # 2
    print(alist)  # ['1', '3']
    return HttpResponse('OK')

注意:

  1. ​查询字符串不区分请求方式,即使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据
  2. 获取客户端地址可以使用HttpRequest对象的META属性
JsonResponse的作用-------帮助我们把数据转换为json字符串;设置响应头Content-Type为application/json

猜你喜欢

转载自blog.csdn.net/Feng_xiaowu/article/details/102731000