• 【安全开发】python—dgango框架


    🔥🔥django框架

    0、前置

    Django 简介 | 菜鸟教程Django 简介 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某..https://www.runoob.com/django/django-intro.html

    Django

    是一个由 Python 编写的一个开放源代码的 Web 应用框架。

    使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。

    MVC 优势:

    • 低耦合
    • 开发快捷
    • 部署方便
    • 可重用性高
    • 维护成本低
    • ...

    Python 加 Django 是快速开发、设计、部署网站的最佳组合。

    MVC 与 MTV模型

    MVC 模型

    MVC 模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

    MVC 以一种插件式的、松耦合的方式连接在一起。

    模型(M)- 编写程序应有的功能,负责业务对象与数据库的映射(ORM)。

    视图(V)- 图形界面,负责与用户的交互(页面)。

    控制器(C)- 负责转发请求,对请求进行处理。

    MTV 模型

    Django 的 MTV 模式本质上和 MVC 是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django 的 MTV 分别是指:

    • M 表示模型(Model):编写程序应有的功能,负责业务对象与数据库的映射(ORM)。
    • T 表示模板 (Template):负责如何把页面(html)展示给用户。
    • V 表示视图(View):负责业务逻辑,并在适当时候调用 Model和 Template。

    1、搭建(mac)

    sudo pip install virtualenv

      sudo pip install virtualenvwrapper

    查找python和 virtualenvwrapper安装位置

     which virtualenvwrapper.sh

     which python3

    sudo vim ~/.bash_profile

    插入如下代码:

    1. export WORKON_HOME=$HOME/.virtualenvs
    2. export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3(python目录)
    3. export VIRTUALENVWRAPPER_VIRTUALENV_ARGS=' -p /usr/bin/python3 '
    4. export PROJECT_HOME=$HOME/Devel
    5. source /usr/local/bin/virtualenvwrapper.sh(virtualenvwrapper目录)

    source  ~/.bash_profile

    尝试创建django环境  ,并安装

     mkvirtualenv my_django_environment

     pip3 install django

    ❤️测试安装

    在你的命令提示符/终端导航到你想存储你Django应用程序的位置。为您的测试站点创建一个文件夹并进入其中。

    1. mkdir django_test
    2. cd django_test

    然后,可以像所展示的一样使用 django-admin 工具创建一个名为“ mytestsite ”的新框架站点。创建网站后,可以 CD 到此文件夹,并将在其中找到管理项目的主要脚本,名为manage.py

    1. django-admin startproject mytestsite
    2. cd mytestsite

    可以在这个文件夹中使用manager.pyrunserver命令运行开发 web 服务器。

    python3 manage.py runserver

    ✨如果报错可尝试下面的命令

    python3 manage.py migrate

     一旦服务器运行,可以通过本地 Web 浏览器打开http://127.0.0.1:8000/来查看该站点:

    2、搭建图书馆网站01

    2.1 创建项目

    1. mkdir locallibrary
    2. cd locallibrary

    django-admin startproject命令创建新项目,并进入该文件夹。

    1. django-admin startproject locallibrary
    2. cd locallibrary

    ❤️❤️locallibrary 项目的子文件夹是整个网站的进入点:

    • settings.py 包含所有的网站设置。这是可以注册所有创建的应用的地方,也是静态文件,数据库配置的地方,等等。
    • urls.py 定义了网站 url 到 view 的映射。虽然这里可以包含所有的 url,但是更常见的做法是把应用相关的 url 包含在相关应用中,可以在接下来的教程里看到。
    • wsgi.py 帮助 Django 应用和网络服务器间的通讯。可以把这个当作模板。

    manage.py脚本可以创建应用,和数据库通讯,启动开发用网络服务器。

    2.2 创建catalog应用

    python3 manage.py startapp catalog

    2.2 注册catalog应用

    打开项目设置文件 locallibrary/locallibrary/settings.py 找到 INSTALLED_APPS 列表里的定义。 如下所示,在列表的最后添加新的一行。

    1. INSTALLED_APPS = [
    2. 'django.contrib.admin',
    3. 'django.contrib.auth',
    4. 'django.contrib.contenttypes',
    5. 'django.contrib.sessions',
    6. 'django.contrib.messages',
    7. 'django.contrib.staticfiles',
    8. 'catalog.apps.CatalogConfig',
    9. ]

    🌟tips:

    (1)新的这行详细说明了应用配置文件在 (CatalogConfig) /locallibrary/catalog/apps.py 里,当你创建应用时就完成了这个过程。

    (2)注意到INSTALLED_APPS已经有许多其他的应用了 (还有 MIDDLEWARE, 在 settings 的下面)。这些应用为 Django administration site 提供了支持和许多功能 (包括会话,认证系统等)

    2.3 配置数据库

    //***为避免性能上的差异,最好在生产和开发中使用同一种数据库。在这个项目里,我们使用 SQLite。

    ***//

    2.4 其他项目设置

    改时区

    TIME_ZONE = 'Asia/Beijing'

    //安全注意⚠️

    • SECRET_KEY. 这个密匙值是 Django 网站安全策略的一部分。如果在开发环境中没有包好这个密匙,把代码投入生产环境时最好用不同的密匙代替。(可能从环境变量或文件中读取)。
    • DEBUG. 这个会在 debug 日志里输出错误信息,而不是输入 HTTP 的返回码。在生产环境中,它应设置为 false,因为输出的错误信息会帮助想要攻击网站的人。
    • //

    2.5 链接url映射器

    将新的项添加到 urlpatterns 列表中。

    1. # Use include() to add paths from the catalog application
    2. from django.conf.urls import include
    3. from django.urls import path
    4. urlpatterns += [
    5. path('catalog/', include('catalog.urls')),
    6. ]

     把网站的根 URL(例:127.0.0.1:8000) 重定向到该 URL:127.0.0.1:8000/catalog/

    将以下行再次添加到文件的底部:

    1. #Add URL maps to redirect the base URL to our application
    2. from django.views.generic import RedirectView
    3. urlpatterns += [
    4. path('', RedirectView.as_view(url='/catalog/')),
    5. ]

     Django 默认不提供 CSS, JavaScript, 和图片等静态文件 。可以通过添加以下行在开发期间启用静态文件的服务。

    1. # Use static() to add url mapping to serve static files during development (only)
    2. from django.conf import settings
    3. from django.conf.urls.static import static
    4. urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

     在 catalog 文件夹下创建一个名为 urls.py 的文件,并添加以下文本以定义导入(空)的 urlpatterns。这是我们在编写应用时添加式样的地方。

     2.6 测试网站框架

    (1)运行数据库迁移

    //Django 使用对象关系映射器(ORM)将 Django 代码中的模型定义映射到底层数据库使用的数据结构。//

    运行以下命令来定义数据库中这些模型的表(确保你位于包含 manage.py 的目录中):

    1. python3 manage.py makemigrations
    2. python3 manage.py migrate

     (2)运行网站

    通过调用 runserver 命令运行 Web 服务器

    python3 manage.py runserver

     

    //现在已经创建了一个完整的基本网站项目骨架,你可以继续填加网址,模型,视图和模版。

    3、使用模型创建图书馆网站02

    3.1 设计图书馆模型

    //Django 允许你定义一对一 (OneToOneField),一对多 (ForeignKey) 和多对多 (ManyToManyField) 的关系

    //模型通常在应用程序的Models .py文件中定义。它们被实现为django.db.models的子类。

    Django Tutorial Part 3: 使用模型 - 学习 Web 开发 | MDNIn this article we've learned how models are defined, and then used this information to design and implement appropriate models for the LocalLibrary website.https://developer.mozilla.org/zh-CN/docs/Learn/Server-side/Django/Models

    1. from django.db import models
    2. class MyModelName(models.Model):
    3. """
    4. A typical class defining a model, derived from the Model class.
    5. """
    6. # Fields
    7. my_field_name = models.CharField(max_length=20, help_text="Enter field documentation")
    8. ...
    9. # Metadata
    10. class Meta:
    11. ordering = ["-my_field_name"]
    12. # Methods
    13. def get_absolute_url(self):
    14. """
    15. Returns the url to access a particular instance of MyModelName.
    16. """
    17. return reverse('model-detail-view', args=[str(self.id)])
    18. def __str__(self):
    19. """
    20. String for representing the MyModelName object (in Admin site etc.)
    21. """
    22. return self.field_name

    创建和修改记录

    1. # Create a new record using the model's constructor.
    2. a_record = MyModelName(my_field_name="Instance #1")
    3. # Save the object into the database.
    4. a_record.save()
    5. # Access model field values using Python attributes.
    6. print(a_record.id) #should return 1 for the first record.
    7. print(a_record.my_field_name) # should print 'Instance #1'
    8. # Change record by modifying the fields, then calling save().
    9. a_record.my_field_name="New Instance Name"
    10. a_record.save()

    存储关于图书类别的信息:

    1. class Genre(models.Model):
    2. """
    3. Model representing a book genre (e.g. Science Fiction, Non Fiction).
    4. """
    5. name = models.CharField(max_length=200, help_text="Enter a book genre (e.g. Science Fiction, French Poetry etc.)")
    6. def __str__(self):
    7. """
    8. String for representing the Model object (in Admin site etc.)
    9. """
    10. return self.name

    使用CharField来表示图书的标题和isbn:

    1. from django.urls import reverse #Used to generate URLs by reversing the URL patterns
    2. class Book(models.Model):
    3. """
    4. Model representing a book (but not a specific copy of a book).
    5. """
    6. title = models.CharField(max_length=200)
    7. author = models.ForeignKey('Author', on_delete=models.SET_NULL, null=True)
    8. # Foreign Key used because book can only have one author, but authors can have multiple books
    9. # Author as a string rather than object because it hasn't been declared yet in the file.
    10. summary = models.TextField(max_length=1000, help_text="Enter a brief description of the book")
    11. isbn = models.CharField('ISBN',max_length=13, help_text='13 Character ISBN number')
    12. genre = models.ManyToManyField(Genre, help_text="Select a genre for this book")
    13. # ManyToManyField used because genre can contain many books. Books can cover many genres.
    14. # Genre class has already been defined so we can specify the object above.
    15. def __str__(self):
    16. """
    17. String for representing the Model object.
    18. """
    19. return self.title
    20. def get_absolute_url(self):
    21. """
    22. Returns the url to access a particular book instance.
    23. """
    24. return reverse('book-detail', args=[str(self.id)])

    BookInstance表示某人可能会借阅的一本书的特定副本,并包括关于该副本是否可用、预期归还日期、“印记”或版本详细信息以及图书馆中该书的惟一id的信息:

    1. import uuid # Required for unique book instances
    2. class BookInstance(models.Model):
    3. """
    4. Model representing a specific copy of a book (i.e. that can be borrowed from the library).
    5. """
    6. id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text="Unique ID for this particular book across whole library")
    7. book = models.ForeignKey('Book', on_delete=models.SET_NULL, null=True)
    8. imprint = models.CharField(max_length=200)
    9. due_back = models.DateField(null=True, blank=True)
    10. LOAN_STATUS = (
    11. ('m', 'Maintenance'),
    12. ('o', 'On loan'),
    13. ('a', 'Available'),
    14. ('r', 'Reserved'),
    15. )
    16. status = models.CharField(max_length=1, choices=LOAN_STATUS, blank=True, default='m', help_text='Book availability')
    17. class Meta:
    18. ordering = ["due_back"]
    19. def __str__(self):
    20. """
    21. String for representing the Model object
    22. """
    23. return '%s (%s)' % (self.id,self.book.title)

    该模型将作者定义为具有名、姓、出生日期和(可选)死亡日期。它指定在默认情况下,__str__()返回姓、名顺序的名称。get_absolute_url()方法反转作者-细节URL映射,以获取用于显示单个作者的URL:

    1. class Author(models.Model):
    2. """
    3. Model representing an author.
    4. """
    5. first_name = models.CharField(max_length=100)
    6. last_name = models.CharField(max_length=100)
    7. date_of_birth = models.DateField(null=True, blank=True)
    8. date_of_death = models.DateField('Died', null=True, blank=True)
    9. def get_absolute_url(self):
    10. """
    11. Returns the url to access a particular author instance.
    12. """
    13. return reverse('author-detail', args=[str(self.id)])
    14. def __str__(self):
    15. """
    16. String for representing the Model object.
    17. """
    18. return '%s, %s' % (self.last_name, self.first_name)

    ❤️❤️重新运行数据库迁移,将它们添加到数据库中

    1. python3 manage.py makemigrations
    2. python3 manage.py migrate

     

     3、dgango管理网站

    3.1 注册模型

    /locallibrary/catalog/admin.py) 中打开 admin.py,复制以下到文件的底部来注册模型。该代码简单地导入模型,调用 admin.site.register 来注册它们。

    1. from .models import Author, Genre, Book, BookInstance
    2. admin.site.register(Book)
    3. admin.site.register(Author)
    4. admin.site.register(Genre)
    5. admin.site.register(BookInstance)

     3.2 创建超级用户

    python3 manage.py createsuperuser

     3.3 登入并使用网站

    重新启动

    python3 manage.py runserver

    访问http://127.0.0.1:8000/admin

    使用刚刚注册的用户、密码可登录

     4、部署

    Django 教程 11: 部署 Django 到生产环境 - 学习 Web 开发 | MDN现在,您已经创建(并测试)了一个令人敬畏的LocalLibrary网站,如果您希望将其安装在公共 Web 服务器上,以便图书馆工作人员和成员可以通过 Internet 访问它。本文概述了如何找到主机来部署您的网站,以及您需要做什么才能让您的网站准备好生产。https://developer.mozilla.org/zh-CN/docs/Learn/Server-side/Django/Deployment

  • 相关阅读:
    取出预训练模型中间层的输出(pytorch)
    操作系统——快速复习笔记01
    Nodejs安装及常见问题
    华为云云耀云服务器L实例评测|云耀云服务器L实例部署Bolo开源个人博客
    Everest Group发布《2023年RPA供应商评估报告》:2家中国厂商持续上榜
    【主流技术】日常工作中关于 JSON 转换的经验大全(Java)
    【开源框架】国内首个通用云计算框架,任意程序都可做成云计算。
    EN 14904运动场地表面—CE认证
    使用Umi 遇到的错误
    Codeforces Round 910 (Div. 2) D. Absolute Beauty
  • 原文地址:https://blog.csdn.net/haoaaao/article/details/127097454