{"id":877070,"date":"2024-07-30T02:58:46","date_gmt":"2024-07-29T18:58:46","guid":{"rendered":"https:\/\/docs.pingcode.com\/ask\/ask-ask\/877070.html"},"modified":"2024-07-30T02:58:50","modified_gmt":"2024-07-29T18:58:50","slug":"%e7%bd%91%e7%ab%99%e5%bc%80%e5%8f%91%e7%9a%84%e5%90%8e%e7%ab%af%e6%80%8e%e4%b9%88%e5%86%99","status":"publish","type":"post","link":"https:\/\/docs.pingcode.com\/ask\/877070.html","title":{"rendered":"\u7f51\u7ad9\u5f00\u53d1\u7684\u540e\u7aef\u600e\u4e48\u5199"},"content":{"rendered":"<p style=\"text-align:center\"><img decoding=\"async\" src=\"https:\/\/cdn-kb.worktile.com\/kb\/wp-content\/uploads\/2024\/04\/24210933\/89025a46-a093-41fd-b578-be1eac986d08.webp\" alt=\"\u7f51\u7ad9\u5f00\u53d1\u7684\u540e\u7aef\u600e\u4e48\u5199\" \/><\/p>\n<p><p><strong>\u7f51\u7ad9\u5f00\u53d1\u7684\u540e\u7aef\u53ef\u4ee5\u901a\u8fc7\u9009\u62e9\u5408\u9002\u7684\u7f16\u7a0b\u8bed\u8a00\u3001\u6846\u67b6\u548c\u6570\u636e\u5e93\u6280\u672f\u6765\u5b9e\u73b0\u3002\u5e38\u89c1\u7684\u540e\u7aef\u6280\u672f\u5305\u62ecPython\uff08Django\u3001Flask\uff09\u3001JavaScript\uff08Node.js\uff09\u3001Java\uff08Spring\uff09\u3001\u4ee5\u53ca\u6570\u636e\u5e93\u7cfb\u7edf\u5982MySQL\u3001PostgreSQL\u3001MongoDB\u7b49\u3002<\/strong> \u5176\u4e2d\uff0c\u9009\u62e9\u5408\u9002\u7684\u7f16\u7a0b\u8bed\u8a00\u548c\u6846\u67b6\u662f\u5173\u952e\u3002\u6bd4\u5982\uff0cPython\u7684Django\u6846\u67b6\u56e0\u5176\u5feb\u901f\u5f00\u53d1\u548c\u4e30\u5bcc\u7684\u529f\u80fd\u88ab\u5e7f\u6cdb\u4f7f\u7528\u3002\u4e0b\u9762\u5c06\u8be6\u7ec6\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528Python\u7684Django\u6846\u67b6\u8fdb\u884c\u7f51\u7ad9\u5f00\u53d1\u3002<\/p>\n<\/p>\n<h2><strong>\u4e00\u3001\u9009\u62e9\u5408\u9002\u7684\u7f16\u7a0b\u8bed\u8a00\u548c\u6846\u67b6<\/strong><\/h2>\n<p><p>\u5728\u8fdb\u884c\u7f51\u7ad9\u540e\u7aef\u5f00\u53d1\u65f6\uff0c\u9009\u62e9\u5408\u9002\u7684\u7f16\u7a0b\u8bed\u8a00\u548c\u6846\u67b6\u662f\u81f3\u5173\u91cd\u8981\u7684\u4e00\u6b65\u3002\u4e0d\u540c\u7684\u7f16\u7a0b\u8bed\u8a00\u548c\u6846\u67b6\u6709\u5404\u81ea\u7684\u4f18\u52bf\u548c\u9002\u7528\u573a\u666f\u3002<\/p>\n<\/p>\n<p><h2>Python\u548cDjango<\/h2>\n<\/p>\n<p><p>Python\u662f\u4e00\u79cd\u9ad8\u7ea7\u7f16\u7a0b\u8bed\u8a00\uff0c\u5177\u6709\u7b80\u6d01\u548c\u6613\u8bfb\u7684\u8bed\u6cd5\u3002Django\u662f\u4e00\u4e2a\u9ad8\u5c42\u6b21\u7684Python Web\u6846\u67b6\uff0c\u9f13\u52b1\u5feb\u901f\u5f00\u53d1\u548c\u6e05\u6670\u7684\u8bbe\u8ba1\u3002Django\u5e26\u6709\u4e30\u5bcc\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u5e2e\u52a9\u5f00\u53d1\u8005\u5feb\u901f\u6784\u5efa\u548c\u90e8\u7f72\u7f51\u7ad9\u3002<\/p>\n<\/p>\n<p><h3>Django\u7684\u4f18\u70b9<\/h3>\n<\/p>\n<ol>\n<li><strong>\u5feb\u901f\u5f00\u53d1<\/strong>\uff1aDjango\u63d0\u4f9b\u4e86\u8bb8\u591a\u5f00\u7bb1\u5373\u7528\u7684\u529f\u80fd\uff0c\u5982\u8ba4\u8bc1\u7cfb\u7edf\u3001\u7ba1\u7406\u754c\u9762\u3001ORM\uff08\u5bf9\u8c61\u5173\u7cfb\u6620\u5c04\uff09\u7b49\uff0c\u4f7f\u5f97\u5f00\u53d1\u8005\u53ef\u4ee5\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u903b\u8f91\uff0c\u800c\u4e0d\u7528\u91cd\u590d\u9020\u8f6e\u5b50\u3002<\/li>\n<li><strong>\u5b89\u5168\u6027<\/strong>\uff1aDjango\u5728\u8bbe\u8ba1\u65f6\u8003\u8651\u4e86\u8bb8\u591a\u5b89\u5168\u6027\u95ee\u9898\uff0c\u5982SQL\u6ce8\u5165\u3001\u8de8\u7ad9\u811a\u672c\u653b\u51fb\uff08XSS\uff09\u3001\u8de8\u7ad9\u8bf7\u6c42\u4f2a\u9020\uff08CSRF\uff09\u7b49\uff0c\u5185\u7f6e\u4e86\u8bb8\u591a\u5b89\u5168\u673a\u5236\u3002<\/li>\n<li><strong>\u6269\u5c55\u6027<\/strong>\uff1aDjango\u5177\u6709\u5f88\u5f3a\u7684\u6269\u5c55\u6027\uff0c\u5141\u8bb8\u5f00\u53d1\u8005\u901a\u8fc7\u4e2d\u95f4\u4ef6\u548c\u7b2c\u4e09\u65b9\u63d2\u4ef6\u6765\u6269\u5c55\u5176\u529f\u80fd\u3002<\/li>\n<\/ol>\n<p><h3>\u5b89\u88c5\u548c\u914d\u7f6eDjango<\/h3>\n<\/p>\n<p><p>\u9996\u5148\uff0c\u5b89\u88c5Python\u548cDjango\u3002\u53ef\u4ee5\u4f7f\u7528pip\u6765\u5b89\u88c5Django\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-bash\">pip install django<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u521b\u5efa\u4e00\u4e2a\u65b0\u7684Django\u9879\u76ee\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-bash\">django-admin startproject myproject<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u8fdb\u5165\u9879\u76ee\u76ee\u5f55\u5e76\u542f\u52a8\u5f00\u53d1\u670d\u52a1\u5668\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-bash\">cd myproject<\/p>\n<p>python manage.py runserver<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u8bbf\u95ee<a href=\"http:\/\/127.0.0.1:8000\/%EF%BC%8C%E5%A6%82%E6%9E%9C%E7%9C%8B%E5%88%B0%E6%AC%A2%E8%BF%8E%E9%A1%B5%E9%9D%A2%EF%BC%8C%E8%AF%B4%E6%98%8EDjango%E5%B7%B2%E7%BB%8F%E6%88%90%E5%8A%9F%E5%AE%89%E8%A3%85%E5%B9%B6%E8%BF%90%E8%A1%8C%E3%80%82\">http:\/\/127.0.0.1:8000\/\uff0c\u5982\u679c\u770b\u5230\u6b22\u8fce\u9875\u9762\uff0c\u8bf4\u660eDjango\u5df2\u7ecf\u6210\u529f\u5b89\u88c5\u5e76\u8fd0\u884c\u3002<\/a><\/p>\n<\/p>\n<h2><strong>\u4e8c\u3001\u6570\u636e\u5e93\u7684\u9009\u62e9\u4e0e\u914d\u7f6e<\/strong><\/h2>\n<p><p>\u6570\u636e\u5e93\u662f\u7f51\u7ad9\u540e\u7aef\u7684\u91cd\u8981\u7ec4\u6210\u90e8\u5206\uff0c\u7528\u4e8e\u5b58\u50a8\u548c\u7ba1\u7406\u6570\u636e\u3002\u5e38\u89c1\u7684\u6570\u636e\u5e93\u7cfb\u7edf\u5305\u62ec\u5173\u7cfb\u578b\u6570\u636e\u5e93\uff08\u5982MySQL\u3001PostgreSQL\uff09\u548c\u975e\u5173\u7cfb\u578b\u6570\u636e\u5e93\uff08\u5982MongoDB\uff09\u3002<\/p>\n<\/p>\n<p><h2>\u5173\u7cfb\u578b\u6570\u636e\u5e93<\/h2>\n<\/p>\n<p><h3>MySQL<\/h3>\n<\/p>\n<p><p>MySQL\u662f\u4e00\u79cd\u5f00\u6e90\u7684\u5173\u7cfb\u578b\u6570\u636e\u5e93\u7ba1\u7406\u7cfb\u7edf\uff0c\u5e7f\u6cdb\u7528\u4e8e\u5404\u79cdWeb\u5e94\u7528\u3002Django\u9ed8\u8ba4\u4f7f\u7528SQLite\uff0c\u4f46\u5728\u751f\u4ea7\u73af\u5883\u4e2d\uff0c\u901a\u5e38\u4f1a\u9009\u62e9MySQL\u6216PostgreSQL\u3002<\/p>\n<\/p>\n<p><h4>\u914d\u7f6eMySQL\u6570\u636e\u5e93<\/h4>\n<\/p>\n<p><p>\u5b89\u88c5MySQL\u5e76\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u6570\u636e\u5e93\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-sql\">CREATE DATABASE mydatabase;<\/p>\n<p>CREATE USER &#039;myuser&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;mypassword&#039;;<\/p>\n<p>GRANT ALL PRIVILEGES ON mydatabase.* TO &#039;myuser&#039;@&#039;localhost&#039;;<\/p>\n<p>FLUSH PRIVILEGES;<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u5728Django\u9879\u76ee\u7684<code>settings.py<\/code>\u6587\u4ef6\u4e2d\uff0c\u914d\u7f6e\u6570\u636e\u5e93\u8fde\u63a5\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-python\">DATABASES = {<\/p>\n<p>    &#039;default&#039;: {<\/p>\n<p>        &#039;ENGINE&#039;: &#039;django.db.backends.mysql&#039;,<\/p>\n<p>        &#039;NAME&#039;: &#039;mydatabase&#039;,<\/p>\n<p>        &#039;USER&#039;: &#039;myuser&#039;,<\/p>\n<p>        &#039;PASSWORD&#039;: &#039;mypassword&#039;,<\/p>\n<p>        &#039;HOST&#039;: &#039;localhost&#039;,<\/p>\n<p>        &#039;PORT&#039;: &#039;3306&#039;,<\/p>\n<p>    }<\/p>\n<p>}<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u5b89\u88c5MySQL\u6570\u636e\u5e93\u9a71\u52a8\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-bash\">pip install mysqlclient<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u7136\u540e\uff0c\u8fd0\u884c\u6570\u636e\u5e93\u8fc1\u79fb\u547d\u4ee4\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-bash\">python manage.py migrate<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h3>PostgreSQL<\/h3>\n<\/p>\n<p><p>PostgreSQL\u662f\u53e6\u4e00\u79cd\u6d41\u884c\u7684\u5173\u7cfb\u578b\u6570\u636e\u5e93\u7cfb\u7edf\uff0c\u5177\u6709\u5f3a\u5927\u7684\u529f\u80fd\u548c\u826f\u597d\u7684\u6027\u80fd\u3002Django\u5bf9PostgreSQL\u63d0\u4f9b\u4e86\u826f\u597d\u7684\u652f\u6301\u3002<\/p>\n<\/p>\n<p><h4>\u914d\u7f6ePostgreSQL\u6570\u636e\u5e93<\/h4>\n<\/p>\n<p><p>\u5b89\u88c5PostgreSQL\u5e76\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u6570\u636e\u5e93\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-sql\">CREATE DATABASE mydatabase;<\/p>\n<p>CREATE USER myuser WITH PASSWORD &#039;mypassword&#039;;<\/p>\n<p>ALTER ROLE myuser SET client_encoding TO &#039;utf8&#039;;<\/p>\n<p>ALTER ROLE myuser SET default_transaction_isolation TO &#039;read committed&#039;;<\/p>\n<p>ALTER ROLE myuser SET timezone TO &#039;UTC&#039;;<\/p>\n<p>GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser;<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u5728Django\u9879\u76ee\u7684<code>settings.py<\/code>\u6587\u4ef6\u4e2d\uff0c\u914d\u7f6e\u6570\u636e\u5e93\u8fde\u63a5\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-python\">DATABASES = {<\/p>\n<p>    &#039;default&#039;: {<\/p>\n<p>        &#039;ENGINE&#039;: &#039;django.db.backends.postgresql&#039;,<\/p>\n<p>        &#039;NAME&#039;: &#039;mydatabase&#039;,<\/p>\n<p>        &#039;USER&#039;: &#039;myuser&#039;,<\/p>\n<p>        &#039;PASSWORD&#039;: &#039;mypassword&#039;,<\/p>\n<p>        &#039;HOST&#039;: &#039;localhost&#039;,<\/p>\n<p>        &#039;PORT&#039;: &#039;5432&#039;,<\/p>\n<p>    }<\/p>\n<p>}<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u5b89\u88c5PostgreSQL\u6570\u636e\u5e93\u9a71\u52a8\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-bash\">pip install psycopg2-binary<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u7136\u540e\uff0c\u8fd0\u884c\u6570\u636e\u5e93\u8fc1\u79fb\u547d\u4ee4\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-bash\">python manage.py migrate<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h2>\u975e\u5173\u7cfb\u578b\u6570\u636e\u5e93<\/h2>\n<\/p>\n<p><h3>MongoDB<\/h3>\n<\/p>\n<p><p>MongoDB\u662f\u4e00\u79cd\u57fa\u4e8e\u6587\u6863\u7684NoSQL\u6570\u636e\u5e93\uff0c\u9002\u7528\u4e8e\u5b58\u50a8\u975e\u7ed3\u6784\u5316\u6570\u636e\u3002Django\u672c\u8eab\u4e0d\u76f4\u63a5\u652f\u6301MongoDB\uff0c\u4f46\u53ef\u4ee5\u4f7f\u7528\u7b2c\u4e09\u65b9\u5e93\u5982Djongo\u6765\u5b9e\u73b0\u3002<\/p>\n<\/p>\n<p><h4>\u914d\u7f6eMongoDB\u6570\u636e\u5e93<\/h4>\n<\/p>\n<p><p>\u5b89\u88c5MongoDB\u5e76\u542f\u52a8\u670d\u52a1\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-bash\">sudo service mongod start<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u5728Django\u9879\u76ee\u4e2d\u5b89\u88c5Djongo\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-bash\">pip install djongo<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u5728Django\u9879\u76ee\u7684<code>settings.py<\/code>\u6587\u4ef6\u4e2d\uff0c\u914d\u7f6e\u6570\u636e\u5e93\u8fde\u63a5\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-python\">DATABASES = {<\/p>\n<p>    &#039;default&#039;: {<\/p>\n<p>        &#039;ENGINE&#039;: &#039;djongo&#039;,<\/p>\n<p>        &#039;NAME&#039;: &#039;mydatabase&#039;,<\/p>\n<p>    }<\/p>\n<p>}<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u7136\u540e\uff0c\u8fd0\u884c\u6570\u636e\u5e93\u8fc1\u79fb\u547d\u4ee4\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-bash\">python manage.py migrate<\/p>\n<p><\/code><\/pre>\n<\/p>\n<h2><strong>\u4e09\u3001\u6a21\u578b\u7684\u8bbe\u8ba1\u4e0e\u5b9e\u73b0<\/strong><\/h2>\n<p><p>\u5728Django\u4e2d\uff0c\u6a21\u578b\uff08Models\uff09\u662f\u7528\u4e8e\u5b9a\u4e49\u6570\u636e\u5e93\u7ed3\u6784\u7684\u7c7b\u3002\u6bcf\u4e2a\u6a21\u578b\u7c7b\u5bf9\u5e94\u6570\u636e\u5e93\u4e2d\u7684\u4e00\u4e2a\u8868\uff0c\u6bcf\u4e2a\u7c7b\u7684\u5c5e\u6027\u5bf9\u5e94\u8868\u4e2d\u7684\u5217\u3002<\/p>\n<\/p>\n<p><h2>\u521b\u5efa\u6a21\u578b<\/h2>\n<\/p>\n<p><p>\u5728Django\u5e94\u7528\u7684<code>models.py<\/code>\u6587\u4ef6\u4e2d\u5b9a\u4e49\u6a21\u578b\u7c7b\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-python\">from django.db import models<\/p>\n<p>class Product(models.Model):<\/p>\n<p>    name = models.CharField(max_length=100)<\/p>\n<p>    price = models.DecimalField(max_digits=10, decimal_places=2)<\/p>\n<p>    description = models.TextField()<\/p>\n<p>    created_at = models.DateTimeField(auto_now_add=True)<\/p>\n<p>    updated_at = models.DateTimeField(auto_now=True)<\/p>\n<p>    def __str__(self):<\/p>\n<p>        return self.name<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h2>\u8fc1\u79fb\u6a21\u578b<\/h2>\n<\/p>\n<p><p>\u5b9a\u4e49\u597d\u6a21\u578b\u540e\uff0c\u9700\u8981\u751f\u6210\u6570\u636e\u5e93\u8fc1\u79fb\u6587\u4ef6\uff0c\u5e76\u5e94\u7528\u8fc1\u79fb\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-bash\">python manage.py makemigrations<\/p>\n<p>python manage.py migrate<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h2>\u4f7f\u7528\u6a21\u578b<\/h2>\n<\/p>\n<p><p>\u521b\u5efa\u3001\u8bfb\u53d6\u3001\u66f4\u65b0\u548c\u5220\u9664\uff08CRUD\uff09\u64cd\u4f5c\u662f\u6570\u636e\u5e93\u64cd\u4f5c\u7684\u57fa\u672c\u529f\u80fd\u3002Django\u63d0\u4f9b\u4e86ORM\uff08\u5bf9\u8c61\u5173\u7cfb\u6620\u5c04\uff09\u6765\u7b80\u5316\u8fd9\u4e9b\u64cd\u4f5c\u3002<\/p>\n<\/p>\n<p><h3>\u521b\u5efa\u8bb0\u5f55<\/h3>\n<\/p>\n<p><pre><code class=\"language-python\">product = Product(name=&#039;Laptop&#039;, price=999.99, description=&#039;A high-performance laptop&#039;)<\/p>\n<p>product.save()<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h3>\u8bfb\u53d6\u8bb0\u5f55<\/h3>\n<\/p>\n<p><pre><code class=\"language-python\">products = Product.objects.all()<\/p>\n<p>for product in products:<\/p>\n<p>    print(product.name, product.price)<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h3>\u66f4\u65b0\u8bb0\u5f55<\/h3>\n<\/p>\n<p><pre><code class=\"language-python\">product = Product.objects.get(id=1)<\/p>\n<p>product.price = 899.99<\/p>\n<p>product.save()<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h3>\u5220\u9664\u8bb0\u5f55<\/h3>\n<\/p>\n<p><pre><code class=\"language-python\">product = Product.objects.get(id=1)<\/p>\n<p>product.delete()<\/p>\n<p><\/code><\/pre>\n<\/p>\n<h2><strong>\u56db\u3001\u89c6\u56fe\u4e0e\u8def\u7531\u7684\u5b9e\u73b0<\/strong><\/h2>\n<p><p>\u5728Django\u4e2d\uff0c\u89c6\u56fe\uff08Views\uff09\u7528\u4e8e\u5904\u7406HTTP\u8bf7\u6c42\u5e76\u8fd4\u56deHTTP\u54cd\u5e94\u3002\u8def\u7531\uff08URLconf\uff09\u7528\u4e8e\u5c06URL\u6620\u5c04\u5230\u89c6\u56fe\u3002<\/p>\n<\/p>\n<p><h2>\u5b9a\u4e49\u89c6\u56fe<\/h2>\n<\/p>\n<p><p>\u5728Django\u5e94\u7528\u7684<code>views.py<\/code>\u6587\u4ef6\u4e2d\u5b9a\u4e49\u89c6\u56fe\u51fd\u6570\u6216\u7c7b\u89c6\u56fe\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-python\">from django.shortcuts import render<\/p>\n<p>from django.http import HttpResponse<\/p>\n<p>from .models import Product<\/p>\n<p>def product_list(request):<\/p>\n<p>    products = Product.objects.all()<\/p>\n<p>    return render(request, &#039;product_list.html&#039;, {&#039;products&#039;: products})<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h2>\u914d\u7f6e\u8def\u7531<\/h2>\n<\/p>\n<p><p>\u5728Django\u5e94\u7528\u7684<code>urls.py<\/code>\u6587\u4ef6\u4e2d\u914d\u7f6e\u8def\u7531\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-python\">from django.urls import path<\/p>\n<p>from . import views<\/p>\n<p>urlpatterns = [<\/p>\n<p>    path(&#039;products\/&#039;, views.product_list, name=&#039;product_list&#039;),<\/p>\n<p>]<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h2>\u521b\u5efa\u6a21\u677f<\/h2>\n<\/p>\n<p><p>\u5728Django\u9879\u76ee\u7684\u6a21\u677f\u76ee\u5f55\u4e2d\u521b\u5efa\u6a21\u677f\u6587\u4ef6\uff0c\u5982<code>product_list.html<\/code>\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-html\">&lt;!DOCTYPE html&gt;<\/p>\n<p>&lt;html&gt;<\/p>\n<p>&lt;head&gt;<\/p>\n<p>    &lt;title&gt;Product List&lt;\/title&gt;<\/p>\n<p>&lt;\/head&gt;<\/p>\n<p>&lt;body&gt;<\/p>\n<p>    &lt;h1&gt;Product List&lt;\/h1&gt;<\/p>\n<p>    &lt;ul&gt;<\/p>\n<p>        {% for product in products %}<\/p>\n<p>            &lt;li&gt;{{ product.name }} - ${{ product.price }}&lt;\/li&gt;<\/p>\n<p>        {% endfor %}<\/p>\n<p>    &lt;\/ul&gt;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&lt;\/html&gt;<\/p>\n<p><\/code><\/pre>\n<\/p>\n<h2><strong>\u4e94\u3001\u7528\u6237\u8ba4\u8bc1\u4e0e\u6388\u6743<\/strong><\/h2>\n<p><p>\u7528\u6237\u8ba4\u8bc1\u4e0e\u6388\u6743\u662f\u7f51\u7ad9\u540e\u7aef\u7684\u91cd\u8981\u529f\u80fd\uff0cDjango\u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684\u5185\u7f6e\u529f\u80fd\u6765\u5904\u7406\u7528\u6237\u8ba4\u8bc1\u4e0e\u6388\u6743\u3002<\/p>\n<\/p>\n<p><h2>\u7528\u6237\u8ba4\u8bc1<\/h2>\n<\/p>\n<p><p>Django\u81ea\u5e26\u4e00\u4e2a\u7528\u6237\u8ba4\u8bc1\u7cfb\u7edf\uff0c\u53ef\u4ee5\u65b9\u4fbf\u5730\u5b9e\u73b0\u7528\u6237\u6ce8\u518c\u3001\u767b\u5f55\u3001\u9000\u51fa\u7b49\u529f\u80fd\u3002<\/p>\n<\/p>\n<p><h3>\u7528\u6237\u6ce8\u518c<\/h3>\n<\/p>\n<p><p>\u5728Django\u5e94\u7528\u7684<code>views.py<\/code>\u6587\u4ef6\u4e2d\u5b9a\u4e49\u7528\u6237\u6ce8\u518c\u89c6\u56fe\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-python\">from django.contrib.auth.models import User<\/p>\n<p>from django.shortcuts import render, redirect<\/p>\n<p>from django.contrib.auth.forms import UserCreationForm<\/p>\n<p>def register(request):<\/p>\n<p>    if request.method == &#039;POST&#039;:<\/p>\n<p>        form = UserCreationForm(request.POST)<\/p>\n<p>        if form.is_valid():<\/p>\n<p>            form.save()<\/p>\n<p>            return redirect(&#039;login&#039;)<\/p>\n<p>    else:<\/p>\n<p>        form = UserCreationForm()<\/p>\n<p>    return render(request, &#039;register.html&#039;, {&#039;form&#039;: form})<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u5728<code>urls.py<\/code>\u6587\u4ef6\u4e2d\u914d\u7f6e\u8def\u7531\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-python\">urlpatterns = [<\/p>\n<p>    path(&#039;register\/&#039;, views.register, name=&#039;register&#039;),<\/p>\n<p>]<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u521b\u5efa\u6ce8\u518c\u6a21\u677f\u6587\u4ef6<code>register.html<\/code>\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-html\">&lt;!DOCTYPE html&gt;<\/p>\n<p>&lt;html&gt;<\/p>\n<p>&lt;head&gt;<\/p>\n<p>    &lt;title&gt;Register&lt;\/title&gt;<\/p>\n<p>&lt;\/head&gt;<\/p>\n<p>&lt;body&gt;<\/p>\n<p>    &lt;h1&gt;Register&lt;\/h1&gt;<\/p>\n<p>    &lt;form method=&quot;post&quot;&gt;<\/p>\n<p>        {% csrf_token %}<\/p>\n<p>        {{ form.as_p }}<\/p>\n<p>        &lt;button type=&quot;submit&quot;&gt;Register&lt;\/button&gt;<\/p>\n<p>    &lt;\/form&gt;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&lt;\/html&gt;<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h3>\u7528\u6237\u767b\u5f55\u4e0e\u9000\u51fa<\/h3>\n<\/p>\n<p><p>\u5728Django\u5e94\u7528\u7684<code>views.py<\/code>\u6587\u4ef6\u4e2d\u5b9a\u4e49\u7528\u6237\u767b\u5f55\u4e0e\u9000\u51fa\u89c6\u56fe\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-python\">from django.contrib.auth import login, logout, authenticate<\/p>\n<p>from django.shortcuts import render, redirect<\/p>\n<p>from django.contrib.auth.forms import AuthenticationForm<\/p>\n<p>def user_login(request):<\/p>\n<p>    if request.method == &#039;POST&#039;:<\/p>\n<p>        form = AuthenticationForm(request, data=request.POST)<\/p>\n<p>        if form.is_valid():<\/p>\n<p>            username = form.cleaned_data.get(&#039;username&#039;)<\/p>\n<p>            password = form.cleaned_data.get(&#039;password&#039;)<\/p>\n<p>            user = authenticate(username=username, password=password)<\/p>\n<p>            if user is not None:<\/p>\n<p>                login(request, user)<\/p>\n<p>                return redirect(&#039;home&#039;)<\/p>\n<p>    else:<\/p>\n<p>        form = AuthenticationForm()<\/p>\n<p>    return render(request, &#039;login.html&#039;, {&#039;form&#039;: form})<\/p>\n<p>def user_logout(request):<\/p>\n<p>    logout(request)<\/p>\n<p>    return redirect(&#039;home&#039;)<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u5728<code>urls.py<\/code>\u6587\u4ef6\u4e2d\u914d\u7f6e\u8def\u7531\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-python\">urlpatterns = [<\/p>\n<p>    path(&#039;login\/&#039;, views.user_login, name=&#039;login&#039;),<\/p>\n<p>    path(&#039;logout\/&#039;, views.user_logout, name=&#039;logout&#039;),<\/p>\n<p>]<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u521b\u5efa\u767b\u5f55\u6a21\u677f\u6587\u4ef6<code>login.html<\/code>\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-html\">&lt;!DOCTYPE html&gt;<\/p>\n<p>&lt;html&gt;<\/p>\n<p>&lt;head&gt;<\/p>\n<p>    &lt;title&gt;Login&lt;\/title&gt;<\/p>\n<p>&lt;\/head&gt;<\/p>\n<p>&lt;body&gt;<\/p>\n<p>    &lt;h1&gt;Login&lt;\/h1&gt;<\/p>\n<p>    &lt;form method=&quot;post&quot;&gt;<\/p>\n<p>        {% csrf_token %}<\/p>\n<p>        {{ form.as_p }}<\/p>\n<p>        &lt;button type=&quot;submit&quot;&gt;Login&lt;\/button&gt;<\/p>\n<p>    &lt;\/form&gt;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&lt;\/html&gt;<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h2>\u7528\u6237\u6388\u6743<\/h2>\n<\/p>\n<p><p>\u7528\u6237\u6388\u6743\u662f\u6307\u5bf9\u7528\u6237\u7684\u8bbf\u95ee\u6743\u9650\u8fdb\u884c\u63a7\u5236\u3002Django\u63d0\u4f9b\u4e86\u57fa\u4e8e\u7528\u6237\u7ec4\u548c\u6743\u9650\u7684\u6388\u6743\u673a\u5236\u3002<\/p>\n<\/p>\n<p><h3>\u7528\u6237\u7ec4<\/h3>\n<\/p>\n<p><p>\u7528\u6237\u7ec4\uff08Group\uff09\u662f\u7528\u6237\u7684\u96c6\u5408\uff0c\u53ef\u4ee5\u4e3a\u7ec4\u5206\u914d\u6743\u9650\u3002Django\u5185\u7f6e\u4e86\u7528\u6237\u7ec4\u7684\u6a21\u578b\uff0c\u53ef\u4ee5\u901a\u8fc7Django\u7ba1\u7406\u754c\u9762\u6216\u4ee3\u7801\u8fdb\u884c\u7ba1\u7406\u3002<\/p>\n<\/p>\n<p><h3>\u6743\u9650<\/h3>\n<\/p>\n<p><p>\u6743\u9650\uff08Permission\uff09\u662f\u5bf9\u67d0\u4e2a\u64cd\u4f5c\u7684\u6388\u6743\uff0c\u53ef\u4ee5\u4e3a\u7528\u6237\u6216\u7ec4\u5206\u914d\u6743\u9650\u3002\u5728Django\u4e2d\uff0c\u53ef\u4ee5\u4f7f\u7528\u88c5\u9970\u5668\u6216\u7c7b\u89c6\u56fe\u7684Mixin\u6765\u63a7\u5236\u8bbf\u95ee\u6743\u9650\u3002<\/p>\n<\/p>\n<p><p>\u4f8b\u5982\uff0c\u4f7f\u7528\u88c5\u9970\u5668\u9650\u5236\u53ea\u6709\u767b\u5f55\u7528\u6237\u624d\u80fd\u8bbf\u95ee\u67d0\u4e2a\u89c6\u56fe\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-python\">from django.contrib.auth.decorators import login_required<\/p>\n<p>@login_required<\/p>\n<p>def product_list(request):<\/p>\n<p>    products = Product.objects.all()<\/p>\n<p>    return render(request, &#039;product_list.html&#039;, {&#039;products&#039;: products})<\/p>\n<p><\/code><\/pre>\n<\/p>\n<h2><strong>\u516d\u3001API\u7684\u8bbe\u8ba1\u4e0e\u5b9e\u73b0<\/strong><\/h2>\n<p><p>\u5728\u73b0\u4ee3Web\u5e94\u7528\u4e2d\uff0cAPI\uff08\u5e94\u7528\u7a0b\u5e8f\u63a5\u53e3\uff09\u662f\u540e\u7aef\u4e0e\u524d\u7aef\u3001\u79fb\u52a8\u7aef\u6216\u5176\u4ed6\u670d\u52a1\u8fdb\u884c\u6570\u636e\u4ea4\u4e92\u7684\u91cd\u8981\u65b9\u5f0f\u3002Django\u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684\u529f\u80fd\u6765\u8bbe\u8ba1\u548c\u5b9e\u73b0API\u3002<\/p>\n<\/p>\n<p><h2>Django REST Framework<\/h2>\n<\/p>\n<p><p>Django REST Framework\uff08DRF\uff09\u662f\u4e00\u4e2a\u5f3a\u5927\u4e14\u7075\u6d3b\u7684\u5de5\u5177\u5305\uff0c\u7528\u4e8e\u6784\u5efaWeb API\u3002\u5b83\u63d0\u4f9b\u4e86\u8bb8\u591a\u5f00\u7bb1\u5373\u7528\u7684\u529f\u80fd\uff0c\u5982\u5e8f\u5217\u5316\u3001\u8eab\u4efd\u9a8c\u8bc1\u3001\u6743\u9650\u63a7\u5236\u7b49\u3002<\/p>\n<\/p>\n<p><h3>\u5b89\u88c5DRF<\/h3>\n<\/p>\n<p><p>\u4f7f\u7528pip\u5b89\u88c5Django REST Framework\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-bash\">pip install djangorestframework<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u5728Django\u9879\u76ee\u7684<code>settings.py<\/code>\u6587\u4ef6\u4e2d\u6dfb\u52a0DRF\u5230\u5df2\u5b89\u88c5\u7684\u5e94\u7528\u5217\u8868\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-python\">INSTALLED_APPS = [<\/p>\n<p>    ...<\/p>\n<p>    &#039;rest_framework&#039;,<\/p>\n<p>]<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h3>\u521b\u5efa\u5e8f\u5217\u5316\u5668<\/h3>\n<\/p>\n<p><p>\u5728Django\u5e94\u7528\u4e2d\u521b\u5efa\u4e00\u4e2a<code>serializers.py<\/code>\u6587\u4ef6\uff0c\u5e76\u5b9a\u4e49\u5e8f\u5217\u5316\u5668\u7c7b\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-python\">from rest_framework import serializers<\/p>\n<p>from .models import Product<\/p>\n<p>class ProductSerializer(serializers.ModelSerializer):<\/p>\n<p>    class Meta:<\/p>\n<p>        model = Product<\/p>\n<p>        fields = &#039;__all__&#039;<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h3>\u521b\u5efaAPI\u89c6\u56fe<\/h3>\n<\/p>\n<p><p>\u5728Django\u5e94\u7528\u7684<code>views.py<\/code>\u6587\u4ef6\u4e2d\u5b9a\u4e49API\u89c6\u56fe\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-python\">from rest_framework import viewsets<\/p>\n<p>from .models import Product<\/p>\n<p>from .serializers import ProductSerializer<\/p>\n<p>class ProductViewSet(viewsets.ModelViewSet):<\/p>\n<p>    queryset = Product.objects.all()<\/p>\n<p>    serializer_class = ProductSerializer<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><p>\u5728Django\u5e94\u7528\u7684<code>urls.py<\/code>\u6587\u4ef6\u4e2d\u914d\u7f6eAPI\u8def\u7531\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-python\">from django.urls import path, include<\/p>\n<p>from rest_framework.routers import DefaultRouter<\/p>\n<p>from . import views<\/p>\n<p>router = DefaultRouter()<\/p>\n<p>router.register(r&#039;products&#039;, views.ProductViewSet)<\/p>\n<p>urlpatterns = [<\/p>\n<p>    path(&#039;&#039;, include(router.urls)),<\/p>\n<p>]<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h3>\u6d4b\u8bd5API<\/h3>\n<\/p>\n<p><p>\u542f\u52a8Django\u5f00\u53d1\u670d\u52a1\u5668\uff0c\u5e76\u8bbf\u95ee<a href=\"http:\/\/127.0.0.1:8000\/products\/%EF%BC%8C%E5%8F%AF%E4%BB%A5%E7%9C%8B%E5%88%B0API%E8%BF%94%E5%9B%9E%E7%9A%84%E4%BA%A7%E5%93%81%E5%88%97%E8%A1%A8%E6%95%B0%E6%8D%AE%E3%80%82\">http:\/\/127.0.0.1:8000\/products\/\uff0c\u53ef\u4ee5\u770b\u5230API\u8fd4\u56de\u7684\u4ea7\u54c1\u5217\u8868\u6570\u636e\u3002<\/a><\/p>\n<\/p>\n<h2><strong>\u4e03\u3001\u6027\u80fd\u4f18\u5316\u4e0e\u5b89\u5168\u6027<\/strong><\/h2>\n<p><p>\u5728\u8fdb\u884c\u7f51\u7ad9\u540e\u7aef\u5f00\u53d1\u65f6\uff0c\u6027\u80fd\u4f18\u5316\u548c\u5b89\u5168\u6027\u662f\u4e24\u4e2a\u91cd\u8981\u7684\u65b9\u9762\u3002\u826f\u597d\u7684\u6027\u80fd\u548c\u5b89\u5168\u6027\u53ef\u4ee5\u63d0\u5347\u7528\u6237\u4f53\u9a8c\u548c\u4fdd\u62a4\u6570\u636e\u5b89\u5168\u3002<\/p>\n<\/p>\n<p><h2>\u6027\u80fd\u4f18\u5316<\/h2>\n<\/p>\n<p><h3>\u7f13\u5b58<\/h3>\n<\/p>\n<p><p>\u7f13\u5b58\u662f\u63d0\u5347\u6027\u80fd\u7684\u6709\u6548\u624b\u6bb5\u3002Django\u63d0\u4f9b\u4e86\u591a\u79cd\u7f13\u5b58\u673a\u5236\uff0c\u5982\u5185\u5b58\u7f13\u5b58\u3001\u6587\u4ef6\u7f13\u5b58\u3001\u6570\u636e\u5e93\u7f13\u5b58\u7b49\u3002<\/p>\n<\/p>\n<p><p>\u5728Django\u9879\u76ee\u7684<code>settings.py<\/code>\u6587\u4ef6\u4e2d\u914d\u7f6e\u7f13\u5b58\uff1a<\/p>\n<\/p>\n<p><pre><code class=\"language-python\">CACHES = {<\/p>\n<p>    &#039;default&#039;: {<\/p>\n<p>        &#039;BACKEND&#039;: &#039;django.core.cache.backends.memcached.MemcachedCache&#039;,<\/p>\n<p>        &#039;LOCATION&#039;: &#039;127.0.0.1:11211&#039;,<\/p>\n<p>    }<\/p>\n<p>}<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h3>\u6570\u636e\u5e93\u4f18\u5316<\/h3>\n<\/p>\n<p><p>\u6570\u636e\u5e93\u4f18\u5316\u662f\u63d0\u5347\u6027\u80fd\u7684\u53e6\u4e00\u4e2a\u91cd\u8981\u65b9\u9762\u3002\u53ef\u4ee5\u901a\u8fc7\u7d22\u5f15\u3001\u67e5\u8be2\u4f18\u5316\u3001\u5206\u5e93\u5206\u8868\u7b49\u624b\u6bb5\u6765\u63d0\u5347\u6570\u636e\u5e93\u6027\u80fd\u3002<\/p>\n<\/p>\n<p><h3>\u5f02\u6b65\u4efb\u52a1<\/h3>\n<\/p>\n<p><p>\u5bf9\u4e8e\u4e00\u4e9b\u8017\u65f6\u7684\u4efb\u52a1\uff0c\u53ef\u4ee5\u4f7f\u7528\u5f02\u6b65\u4efb\u52a1\u6765\u63d0\u5347\u6027\u80fd\u3002Django\u53ef\u4ee5\u4e0eCelery\u7b49\u5f02\u6b65\u4efb\u52a1\u961f\u5217\u5de5\u5177\u96c6\u6210\u3002<\/p>\n<\/p>\n<p><h2>\u5b89\u5168\u6027<\/h2>\n<\/p>\n<p><h3>SQL\u6ce8\u5165<\/h3>\n<\/p>\n<p><p>Django ORM\u5728\u8bbe\u8ba1\u65f6\u5df2\u7ecf\u8003\u8651\u4e86SQL\u6ce8\u5165\u95ee\u9898\uff0c\u901a\u8fc7\u53c2\u6570\u5316\u67e5\u8be2\u6765\u9632\u6b62SQL\u6ce8\u5165\u653b\u51fb\u3002<\/p>\n<\/p>\n<p><h3>\u8de8\u7ad9\u811a\u672c\u653b\u51fb\uff08XSS\uff09<\/h3>\n<\/p>\n<p><p>Django\u81ea\u52a8\u5bf9\u6a21\u677f\u4e2d\u7684\u53d8\u91cf\u8fdb\u884c\u8f6c\u4e49\uff0c\u4ee5\u9632\u6b62XSS\u653b\u51fb\u3002\u6b64\u5916\uff0c\u53ef\u4ee5\u4f7f\u7528Django\u7684\u5b89\u5168\u8fc7\u6ee4\u5668\u548c\u4e2d\u95f4\u4ef6\u6765\u589e\u5f3aXSS\u9632\u62a4\u3002<\/p>\n<\/p>\n<p><h3>\u8de8\u7ad9\u8bf7\u6c42\u4f2a\u9020\uff08CSRF\uff09<\/h3>\n<\/p>\n<p><p>Django\u5185\u7f6e\u4e86CSRF\u9632\u62a4\u673a\u5236\uff0c\u901a\u8fc7\u5728\u8868\u5355\u4e2d\u6dfb\u52a0CSRF\u4ee4\u724c\u6765\u9632\u6b62CSRF\u653b\u51fb\u3002<\/p>\n<\/p>\n<p><pre><code class=\"language-html\">&lt;form method=&quot;post&quot;&gt;<\/p>\n<p>    {% csrf_token %}<\/p>\n<p>    ...<\/p>\n<p>&lt;\/form&gt;<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h3>HTTPS<\/h3>\n<\/p>\n<p><p>\u4f7f\u7528HTTPS\u53ef\u4ee5\u52a0\u5bc6\u6570\u636e\u4f20\u8f93\uff0c\u63d0\u5347\u5b89\u5168\u6027\u3002\u53ef\u4ee5\u901a\u8fc7\u914d\u7f6eWeb\u670d\u52a1\u5668\uff08\u5982Nginx\u3001Apache\uff09\u6765\u542f\u7528HTTPS\u3002<\/p>\n<\/p>\n<h2><strong>\u516b\u3001\u90e8\u7f72\u4e0e\u8fd0\u7ef4<\/strong><\/h2>\n<p><p>\u5f00\u53d1\u5b8c\u6210\u540e\uff0c\u9700\u8981\u5c06\u7f51\u7ad9\u90e8\u7f72\u5230\u751f\u4ea7\u73af\u5883\uff0c\u5e76\u8fdb\u884c\u8fd0\u7ef4\u7ba1\u7406\u3002<\/p>\n<\/p>\n<p><h2>\u90e8\u7f72<\/h2>\n<\/p>\n<p><h3>Web\u670d\u52a1\u5668<\/h3>\n<\/p>\n<p><p>\u9009\u62e9\u5408\u9002\u7684Web\u670d\u52a1\u5668\uff0c\u5982Nginx\u6216Apache\uff0c\u6765\u90e8\u7f72Django\u5e94\u7528\u3002\u53ef\u4ee5\u901a\u8fc7\u914d\u7f6e\u53cd\u5411\u4ee3\u7406\u548cWSGI\u6765\u8fd0\u884cDjango\u5e94\u7528\u3002<\/p>\n<\/p>\n<p><h3>\u6570\u636e\u5e93<\/h3>\n<\/p>\n<p><p>\u5728\u751f\u4ea7\u73af\u5883\u4e2d\uff0c\u9009\u62e9\u7a33\u5b9a\u548c\u9ad8\u6027\u80fd\u7684\u6570\u636e\u5e93\u7cfb\u7edf\uff0c\u5982MySQL\u6216PostgreSQL\uff0c\u5e76\u8fdb\u884c\u9002\u5f53\u7684\u914d\u7f6e\u548c\u4f18\u5316\u3002<\/p>\n<\/p>\n<p><h3>\u8d1f\u8f7d\u5747\u8861<\/h3>\n<\/p>\n<p><p>\u5bf9\u4e8e\u9ad8\u5e76\u53d1\u5e94\u7528\uff0c\u53ef\u4ee5\u901a\u8fc7\u8d1f\u8f7d\u5747\u8861\u5668\uff08\u5982HAProxy\u3001Nginx\uff09\u6765\u5206\u62c5\u8d1f\u8f7d\uff0c\u63d0\u5347\u7cfb\u7edf\u6027\u80fd\u548c\u53ef\u9760\u6027\u3002<\/p>\n<\/p>\n<p><h2>\u8fd0\u7ef4<\/h2>\n<\/p>\n<p><h3>\u65e5\u5fd7\u7ba1\u7406<\/h3>\n<\/p>\n<p><p>\u65e5\u5fd7\u662f\u8fd0\u7ef4\u7ba1\u7406\u7684\u91cd\u8981\u5de5\u5177\u3002Django\u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684\u65e5\u5fd7\u914d\u7f6e\u9009\u9879\uff0c\u53ef\u4ee5\u5c06\u65e5\u5fd7\u8f93\u51fa\u5230\u6587\u4ef6\u3001\u6570\u636e\u5e93\u6216\u65e5\u5fd7\u7ba1\u7406\u7cfb\u7edf\u3002<\/p>\n<\/p>\n<p><h3>\u76d1\u63a7<\/h3>\n<\/p>\n<p><p>\u901a\u8fc7\u76d1\u63a7\u5de5\u5177\uff08\u5982Prometheus\u3001Grafana\uff09\u6765\u5b9e\u65f6\u76d1\u63a7\u7cfb\u7edf\u6027\u80fd\u548c\u8fd0\u884c\u72b6\u6001\uff0c\u53ca\u65f6\u53d1\u73b0\u548c\u5904\u7406\u95ee\u9898\u3002<\/p>\n<\/p>\n<p><h3>\u81ea\u52a8\u5316\u90e8\u7f72<\/h3>\n<\/p>\n<p><p>\u4f7f\u7528<a href=\"https:\/\/docs.pingcode.com\/blog\/devops\/52691.html\" target=\"_blank\">CI\/CD<\/a>\u5de5\u5177\uff08\u5982Jenkins\u3001GitLab CI\uff09\u6765\u5b9e\u73b0\u81ea\u52a8\u5316\u90e8\u7f72\uff0c\u63d0\u9ad8\u5f00\u53d1\u548c\u8fd0\u7ef4\u6548\u7387\u3002<\/p>\n<\/p>\n<h2><strong>\u7ed3\u8bba<\/strong><\/h2>\n<p><p>\u7f51\u7ad9\u5f00\u53d1\u7684\u540e\u7aef\u662f\u4e00\u4e2a\u590d\u6742\u800c\u53c8\u5173\u952e\u7684\u8fc7\u7a0b\u3002\u901a\u8fc7\u9009\u62e9\u5408\u9002\u7684\u7f16\u7a0b\u8bed\u8a00\u548c\u6846\u67b6\u3001\u8bbe\u8ba1\u5408\u7406\u7684\u6570\u636e\u5e93\u7ed3\u6784\u3001\u5b9e\u73b0\u9ad8\u6548\u7684API\u3001\u8fdb\u884c\u6027\u80fd\u4f18\u5316\u548c\u5b89\u5168\u6027\u4fdd\u969c\uff0c\u5e76\u4e14\u8fdb\u884c\u826f\u597d\u7684\u90e8\u7f72\u548c\u8fd0\u7ef4\u7ba1\u7406\uff0c\u53ef\u4ee5\u6253\u9020\u4e00\u4e2a\u9ad8\u6027\u80fd\u3001\u5b89\u5168\u3001\u53ef\u6269\u5c55\u7684\u7f51\u7ad9\u540e\u7aef\u7cfb\u7edf\u3002\u5e0c\u671b\u901a\u8fc7\u672c\u6587\u7684\u4ecb\u7ecd\uff0c\u60a8\u80fd\u591f\u5bf9\u7f51\u7ad9\u540e\u7aef\u5f00\u53d1\u6709\u4e00\u4e2a\u5168\u9762\u7684\u4e86\u89e3\uff0c\u5e76\u80fd\u591f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\u5e94\u7528\u8fd9\u4e9b\u77e5\u8bc6\u3002<\/p>\n<\/p>\n<h2><strong>\u76f8\u5173\u95ee\u7b54FAQs\uff1a<\/strong><\/h2>\n<p><strong>1. \u540e\u7aef\u5f00\u53d1\u662f\u4ec0\u4e48\uff1f<\/strong><\/p>\n<p>\u540e\u7aef\u5f00\u53d1\u662f\u6307\u6784\u5efa\u7f51\u7ad9\u6216\u5e94\u7528\u7a0b\u5e8f\u7684\u670d\u52a1\u5668\u7aef\u90e8\u5206\uff0c\u5b83\u8d1f\u8d23\u5904\u7406\u7528\u6237\u8bf7\u6c42\u3001\u6570\u636e\u5b58\u50a8\u548c\u4e1a\u52a1\u903b\u8f91\u7b49\u3002\u540e\u7aef\u5f00\u53d1\u901a\u5e38\u4f7f\u7528\u7f16\u7a0b\u8bed\u8a00\uff08\u5982Java\u3001Python\u7b49\uff09\u548c\u76f8\u5e94\u7684\u6846\u67b6\u6765\u5b9e\u73b0\u3002<\/p>\n<p><strong>2. \u540e\u7aef\u5f00\u53d1\u7684\u57fa\u672c\u5de5\u4f5c\u6d41\u7a0b\u662f\u600e\u6837\u7684\uff1f<\/strong><\/p>\n<p>\u540e\u7aef\u5f00\u53d1\u7684\u57fa\u672c\u5de5\u4f5c\u6d41\u7a0b\u5305\u62ec\u9700\u6c42\u5206\u6790\u3001\u6570\u636e\u5e93\u8bbe\u8ba1\u3001\u7f16\u7801\u3001\u6d4b\u8bd5\u548c\u90e8\u7f72\u7b49\u3002\u9996\u5148\uff0c\u5f00\u53d1\u4eba\u5458\u9700\u8981\u4e0e\u5ba2\u6237\u6216\u56e2\u961f\u6210\u5458\u4e00\u8d77\u5206\u6790\u9700\u6c42\uff0c\u786e\u5b9a\u529f\u80fd\u548c\u4e1a\u52a1\u903b\u8f91\u3002\u7136\u540e\uff0c\u8bbe\u8ba1\u6570\u636e\u5e93\u7ed3\u6784\uff0c\u4ee5\u4fbf\u5b58\u50a8\u548c\u7ba1\u7406\u6570\u636e\u3002\u63a5\u4e0b\u6765\uff0c\u6839\u636e\u9700\u6c42\u7f16\u5199\u4ee3\u7801\uff0c\u5e76\u8fdb\u884c\u6d4b\u8bd5\u4ee5\u786e\u4fdd\u529f\u80fd\u6b63\u5e38\u8fd0\u884c\u3002\u6700\u540e\uff0c\u5c06\u4ee3\u7801\u90e8\u7f72\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u4f7f\u5176\u53ef\u4ee5\u88ab\u7528\u6237\u8bbf\u95ee\u548c\u4f7f\u7528\u3002<\/p>\n<p><strong>3. \u5982\u4f55\u9009\u62e9\u5408\u9002\u7684\u540e\u7aef\u5f00\u53d1\u8bed\u8a00\u548c\u6846\u67b6\uff1f<\/strong><\/p>\n<p>\u9009\u62e9\u5408\u9002\u7684\u540e\u7aef\u5f00\u53d1\u8bed\u8a00\u548c\u6846\u67b6\u53d6\u51b3\u4e8e\u9879\u76ee\u7684\u9700\u6c42\u548c\u5f00\u53d1\u4eba\u5458\u7684\u7ecf\u9a8c\u3002\u9996\u5148\uff0c\u9700\u8981\u8003\u8651\u9879\u76ee\u7684\u89c4\u6a21\u548c\u590d\u6742\u5ea6\uff0c\u4ee5\u786e\u5b9a\u662f\u5426\u9700\u8981\u4e00\u79cd\u66f4\u5f3a\u5927\u7684\u8bed\u8a00\u548c\u6846\u67b6\u3002\u5176\u6b21\uff0c\u8003\u8651\u5f00\u53d1\u4eba\u5458\u7684\u7ecf\u9a8c\u548c\u719f\u6089\u7a0b\u5ea6\uff0c\u9009\u62e9\u4ed6\u4eec\u719f\u6089\u7684\u8bed\u8a00\u548c\u6846\u67b6\u80fd\u591f\u63d0\u9ad8\u5f00\u53d1\u6548\u7387\u3002\u6b64\u5916\uff0c\u8fd8\u9700\u8981\u8003\u8651\u8bed\u8a00\u548c\u6846\u67b6\u7684\u751f\u6001\u7cfb\u7edf\u548c\u793e\u533a\u652f\u6301\uff0c\u4ee5\u4fbf\u83b7\u5f97\u66f4\u597d\u7684\u652f\u6301\u548c\u8d44\u6e90\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"\u7f51\u7ad9\u5f00\u53d1\u7684\u540e\u7aef\u53ef\u4ee5\u901a\u8fc7\u9009\u62e9\u5408\u9002\u7684\u7f16\u7a0b\u8bed\u8a00\u3001\u6846\u67b6\u548c\u6570\u636e\u5e93\u6280\u672f\u6765\u5b9e\u73b0\u3002\u5e38\u89c1\u7684\u540e\u7aef\u6280\u672f\u5305\u62ecPython\uff08Django [&hellip;]","protected":false},"author":3,"featured_media":877079,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[37],"tags":[],"acf":[],"_links":{"self":[{"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/posts\/877070"}],"collection":[{"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/comments?post=877070"}],"version-history":[{"count":"1","href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/posts\/877070\/revisions"}],"predecessor-version":[{"id":877081,"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/posts\/877070\/revisions\/877081"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/media\/877079"}],"wp:attachment":[{"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/media?parent=877070"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/categories?post=877070"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/tags?post=877070"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}