Djiango框架秘籍

Python的WEB框架有Django、Tornado、Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等诸多功能。

基本配置

一、创建django程序

  • 终端命令:django-admin startproject sitename   在终端创建目录
  • cd mysite
  • python manage.py starapp app01  创建一个app
  • IDE创建Django程序时,本质上都是自动执行上述命令

其他常用命令:

  python manage.py runserver 0.0.0.0   

  python manage.py startapp appname   

  python manage.py syncdb   

  python manage.py makemigrations   

  python manage.py migrate

  python manage.py createsuperuser

二、程序目录

三、配置文件

1、数据库

DATABASES = {
    ‘default‘: {
    ‘ENGINE‘: ‘django.db.backends.mysql‘,
    ‘NAME‘:‘dbname‘,
    ‘USER‘: ‘root‘,
    ‘PASSWORD‘: ‘xxx‘,
    ‘HOST‘: ‘‘,
    ‘PORT‘: ‘‘,
    }
}
由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替 

# 如下设置放置的与project同名的配置的 __init__.py文件中  

import pymysql
pymysql.install_as_MySQLdb() 

2、模版

TEMPLATE_DIRS = (
        os.path.join(BASE_DIR,‘templates‘),
    )

3、静态文件

STATICFILES_DIRS = (
        os.path.join(BASE_DIR,‘static‘),
    )

路由系统

1、单一路由对应

url(r‘^index$‘, views.index),

2、基于正则的路由

url(r‘^index/(\d*)‘, views.index),
url(r‘^manage/(?P<name>\w*)/(?P<id>\d*)‘, views.manage),

3、添加额外的参数

url(r‘^manage/(?P<name>\w*)‘, views.manage,{‘id‘:333}),

4、为路由映射设置名称

url(r‘^home‘, views.home, name=‘h1‘),
url(r‘^index/(\d*)‘, views.index, name=‘h2‘),

设置名称之后,可以在不同的地方调用,如:

  • 模板中使用生成URL     {% url ‘h2‘ 2012 %}
  • 函数中使用生成URL     reverse(‘h2‘, args=(2012,))      路径:django.urls.reverse
  • Model中使用获取URL  自定义get_absolute_url() 方法
class NewType(models.Model):
    caption = models.CharField(max_length=16)

    def get_absolute_url(self):
        """
        为每个对象生成一个URL
        应用:在对象列表中生成查看详细的URL,使用此方法即可!!!
        :return:
        """
        # return ‘/%s/%s‘ % (self._meta.db_table, self.id)
        # 或
        from django.urls import reverse
        return reverse(‘NewType.Detail‘, kwargs={‘nid‘: self.id})

获取请求匹配成功的URL信息:request.resolver_match

5、根据app对路由规则进行分类  

url(r‘^web/‘,include(‘web.urls‘)),

6、命名空间

a. project.urls.py

from django.conf.urls import url,include 

urlpatterns = [
    url(r‘^a/‘, include(‘app01.urls‘, namespace=‘author-polls‘)),
    url(r‘^b/‘, include(‘app01.urls‘, namespace=‘publisher-polls‘)),
]

b. app01.urls.py

from django.conf.urls import url
from app01 import views 

app_name = ‘app01‘
urlpatterns = [
    url(r‘^(?P<pk>\d+)/$‘, views.detail, name=‘detail‘)
]

c. app01.views.py

def detail(request, pk):
    print(request.resolver_match)
    return HttpResponse(pk)

以上定义带命名空间的url之后,使用name生成URL时候,应该如下:

  • v = reverse(‘app01:detail‘, kwargs={‘pk‘:11})
  • {% url ‘app01:detail‘ pk=12 pp=99 %}

django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。

通过反射机制,为django开发一套动态的路由系统Demo: 点击下载

Django目录介绍、路由系统、 ORM操作

Django目录介绍
        django-admin startproject mysite  在终端创建目录
        cd mysite
        python manage.py starapp app01    创建一个app 

        project
            - app01
                -migrations  和数据库相关,和modal相关
                - admin   Django自带后台管理相关配置
                - modal   写类,根据类创建数据库表
                - test    单元测试
                - views   业务处理,业务可以分类
            - app02
            - app03

    1. 路由系统(位置参数和形式参数不要不要混用,*args,**kwargs可以接收参数)
        url -> 函数

        a. /login/ -> def login        SEO权重不高

        b. /add-user/(\d+)/  ->  def add_user(request,a1)
           /add-user/(\d+)/(\d+)/ ->  def add_user(request,a1,a2)    位置参数

        c. /add-user/(?P<a1>\d+)/  ->  def add_user(request,a1)        形式参数

        url(r‘^index/‘, views.index),   访问时必须index/这种形式
        url(r‘^index$‘, views.index),   访问时必须index这种形式
        url(r‘^index‘, views.index),     访问时index开头的任意字符串都可以访问
        url(r‘^index/(\d+).html‘, views.index),   访问时必须index/(\d+).html开头的这种形式
        url(r‘^‘, views.index)            没有匹配成功,设置默认html
        PS:
            终止符:
                ^edit$
            伪静态    提高SEO权重
                url(r‘^edit/(\w+).html$‘, views.edit),
        d. 路由分发
            urls.py中
            导入from django.conf.urls import include
                url(r‘^app01/‘, include(‘app01.urls‘)),

                先在总路由匹配app路径,然后去该app下urls.py中去匹配路径

            app01.urls.py
                url(r‘^index.html$‘, views.index),

        e. 路由系统之别名反向生成url            

            根据名称可以反向生成URL
            1. url(r‘^index/‘, views.index,name="n1)
            在Python代码中,在viws.py中
            def index(request):
                from django.urls import reverse
                v = reverse(‘n1‘)
                print(v)    #生成url路径/index/

             url(r‘^index/(\d+)/‘, views.index,name="n1)
            在Python代码中,在viws.py中
            def index(request,a1):
                from django.urls import reverse
                v = reverse(‘n1‘,args={451})
                print(v)    #生成url路径/index/451/

             url(r‘^index/(?P<a1>\d+)/‘, views.index,name="n1)
            在Python代码中,在viws.py中
            def index(request,a1):
                from django.urls import reverse
                v = reverse(‘n1‘,kwargs={‘a1‘:1111})
                print(v)    #生成url路径/index/1111/

            2. 在路由文件中
                url(r‘^login/‘, views.login,name=‘m1‘)
                在html文件中
                {% url "m1" %} 提交就可以找到/login/路径

                在路由文件中
                url(r‘^login/(\W)/‘, views.login,name=‘m1‘)
                url(r‘^login/(\W).html$‘, views.login,name=‘m1‘)
                在html文件中
                {% for i in user_list %}
                    <li>{{ i }}|<a href="{% url "m1" i %}">编辑</a></li>
                {% endfor %}
                提交就可以找到/login/i路径
                提交就可以找到/login/i.html路径

    3. ORM操作
        ORM利用pymysql第三方工具连接数据库
        默认:使用SQLlite 数据库
        Http请求:
            url -> 视图(模板+数据)
        步骤:
            1. 创建数据库:在数据库创建70db
            2. 在settings中设置
                # DATABASES = {
                #     ‘default‘: {
                #         ‘ENGINE‘: ‘django.db.backends.sqlite3‘,
                #         ‘NAME‘: os.path.join(BASE_DIR, ‘db.sqlite3‘),
                #     }
                # }

                DATABASES = {
                    ‘default‘: {
                        ‘ENGINE‘: ‘django.db.backends.mysql‘,
                        ‘NAME‘:‘70db‘,
                        ‘USER‘: ‘root‘,
                        ‘PASSWORD‘: ‘‘,
                        ‘HOST‘: ‘localhost‘,
                        ‘PORT‘: 3306,
                        }
                }
        3. 在项目__init__.py中更换默认连接数据库的方式,MySQLDB(修改django默认连接mySQL方式)
            import pymysql
            pymysql.install_as_MySQLdb()

        4.在app下的models.py下:创建表
        from django.db import models

        class user_group(models.Model):
            title = models.CharField(max_length=32)

        class user_info(models.Model):
            id = models.BigAutoField(primary_key=True)   #这一列不写也会自动生成
            username=models.CharField(max_length=32)
            password=models.CharField(max_length=64)
            # age = models.IntegerField(null=True)  #设置可以为空,创建表后插入这一列时可以这么设置
            age = models.IntegerField(default=1)
            #默认生成ug_id,设置可以为空,创建表后插入这一列时可以这么设置
            ug = models.ForeignKey("user_group",null=True)

        5.在配置中注册app
        INSTALLED_APPS = [
            ‘django.contrib.admin‘,
            ‘django.contrib.auth‘,
            ‘django.contrib.contenttypes‘,
            ‘django.contrib.sessions‘,
            ‘django.contrib.messages‘,
            ‘django.contrib.staticfiles‘,
            ‘app01‘
        ]

        6.创建数据表
            命令:
            python manage.py makemigrations
            python manage.py migrate

        ORM操作表:
            创建表
            修改表
            删除表
        操作数据行:
            增删改查
            基于ORM实现组表操作
            #新增
            # models.user_group.objects.create(title="销售部")
            # models.user_info.objects.create(user=‘root‘,password=‘pwd‘,age=18,ug_id=1)
            # 查找
            # group_list = models.user_group.objects.all()
            # group_list = models.user_group.objects.filter(id=1)
            # group_list = models.user_group.objects.filter(id__gt=1)   #大于
            # group_list = models.user_group.objects.filter(id__lt=1)   #小于

            # print(group_list)   #group_list是QuerySet类型,可以看成列表
            # group_list QuerySet类型(列表)
            # QuerySet类型[obj,obj,obj]
            # for row in group_list:
            #     print(row.id,row.title)
            # models.user_info.objects.all()

            # 删除
            # models.user_group.objects.filter(id=2).delete()

            # 更新
            # models.user_group.objects.filter(id=2).update(title=‘公关部‘)

            基于ORM实现员工表操作
                1.增加

                    models.UserInfo.objects.create(user=‘root‘,password=‘123‘,age=10,ug_id=1)

                    obj = models.UserGroup.objects.filter(id=1).first()
                    models.UserInfo.objects.create(user=‘root‘,password=‘123‘,age=10,ug=obj)

                2. 删除:
                    models.UserInfo.objects.filter(id=2).delete()

                3. 修改:
                    models.UserInfo.objects.filter(id=2).update(title=‘公关部‘)

                4. 查询:
                    group_list = models.UserInfo.objects.all()
                    group_list获取的是QuerySet,内部元素是UserInfo对象,每一个对象代指一行数据,
                    对象中如果包含ForeignKey,则代指与其关联表的一行数据

                    for row in group_list:
                        print(row.user)
                        print(row.age)
                        print(row.ug_id)    # 用户信息关联的部门ID
                        print(row.ug.title) # 用户信息关联的部门名称
时间: 2024-10-16 04:39:53

Djiango框架秘籍的相关文章

正宗Djiango框架(Bootstrap 、Django母版、Cookie)

一. Bootstrap 一个包含CSS和JS的一个代码库   -- 样式 -- 响应式 @media关键字 --导航条 @media(nin-width:768px){ .header{ color:red } } --- 栅格(12分块,几种屏幕显示方式) 除了.col-xs总是水平排列,其他开始是堆叠在一起的,当大于这些阈值时将变为水平排列 <div style="background-color: #dddddd"> //大屏幕min-width:1170px &l

Django中常用字段

一.Djiango框架的常用字段 Django ORM 常用字段和参数 常用字段 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型,范围在 -2147483648 to 2147483647.(一般不用它来存手机号(位数也不够),直接用字符串存,) CharField 字符类型,必须提供max_length参数, max_length表示字符长度. 这

Foundation框架快速搜索秘籍

基本上包含了Foudation框架内的所有函数和方法.使用方法:全选,自己建一个文本类的文件,如果要使用某个方法却想不起来方法名,直接在文本中搜索关键字即可. 2.1 算术运算函数 2.1.1 rand()函数:产生随机数 2.1.2 abs()函数/labs()函数:整数的绝对值 2.1.3 fabs()/fabsf()/fabsl()函数:浮点数的绝对值 2.1.4 floor()/floorf()/floorl()函数:向下取整 2.1.5 ceil()/ceilf()/ceill()函数

应用安全 - 编程语言 | 框架 - PHP - Djiango - 漏洞 -汇总

CVE-2007-0404 Date August 16, 2006 类型Filename validation issue in translation framework. Full description 影响范围 CVE-2007-0405 Date January 21, 2007 类型 Apparent “caching” of authenticated user. Full description Issues under Django’s security process¶Al

Spring cloud整体框架

研究了一段时间spring boot了准备向spirng cloud进发,公司架构和项目也全面拥抱了Spring Cloud.在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统构建的要求,使我们以非常低的成本(技术或者硬件)搭建一套高效.分布式.容错的平台,但Spring Cloud也不是没有缺点,小型独立的项目不适合使用,另外对分布式事物的支持暂时也没有. Spring Cloud是什么鬼? Spring Cloud是一个基于Spring Boot实现的云应用开发工具,

IOC演义 第一回: 重构类步步为营 新框架萌芽胎动

 问题探讨 目前的网站在编程文章的表现上,一般都会把代码折叠起来,而文字部分却始终显示,给人代码似乎可有可无的感觉.实际情况往往恰恰相反:代码和插图.文字应该是文章的三个表现手段,许多情况下插图和文字应该是围绕代码展开的,是对代码的说明和原理展示,或者说主角往往应该是代码,文字和插图则是点缀.这样我们为什么不能把文字作为代码的注释呢?一段代码想要表达什么意思,每个人看后的领悟应该不会完全相同,最权威的表达无疑是代码的作者.把代码和文字存放在一块,不就把作者的意图共同保存了吗? 本文就是在vs20

Android数据库高手秘籍(三)——使用LitePal升级表

在上一篇文章中,我们学习了LitePal的基本用法,体验了使用框架来进行创建表操作的便利.然而大家都知道,创建表只是数据库操作中最基本的一 步而已,我们在一开始创建的表结构,随着需求的变更,到了后期是极有可能需要修改的.因此,升级表的操作对于任何一个项目也是至关重要的,那么今天我们就 一起来学习一下,在Android传统开发当中升级表的方式,以及使用LitePal来进行升级表操作的用法.如果你还没有看过前一篇文章,建议先去参考 一下 Android数据库高手秘籍(二)——创建表和LitePal的

成为专业程序员路上用到的各种优秀资料、神器及框架

最近想着怎么把自己的知识体系进行整理起来,使用思维导图进行描述,对自己以后的发展也有一个更深的认识,更快的提升自己:看到了下面这篇文章,感觉非常实用,从语言到框架都非常全面,自己也可以继续补充,也是对自己知识体系的一个补充吧. 前言 成为一名专业程序员的道路上,需要坚持练习.学习与积累,技术方面既要有一定的广度,更要有自己的深度. 笔者作为一位tool mad,将工作以来用到的各种优秀资料.神器及框架整理在此,毕竟好记性不如烂键盘,此项目可以作为自己的不时之需. 本人喜欢折腾,记录的东西也比较杂

【真正福利】成为专业程序员路上用到的各种优秀资料、神器及框架

转载,原地址:http://www.cnblogs.com/jasondan/p/6380597.html 据说看到好文章不推荐的人,服务器容易宕机!本文版权归翟士丹(Stan Zhai)和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利. 好东西不是随便收集下,发篇博文,骗些点赞的!积累了5年多的东西,是时候放出来跟大家见见面了. 或许有的园友在14年的时候收藏过我的一篇"工欲善其事.必先利其器"的博文,时隔3年,已经